
/*
 * 
 *   Copyright 2016 RIFT.IO Inc
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
import React from 'react';
import './crash.scss';
import TreeView from 'react-treeview';
import '../node_modules/react-treeview/react-treeview.css';
import AppHeader from 'widgets/header/header.jsx';
var crashActions = require('./crashActions.js');
var crashStore = require('./crashStore.js');
// var MissionControlStore = require('../missioncontrol/missionControlStore.js');
function openDashboard() {
  window.location.hash = "#/";
}
class CrashDetails extends React.Component {
  constructor(props) {
    super(props)
    var self = this;
    this.state = crashStore.getState();
    crashStore.listen(this.storeListener);
  }
  storeListener = (data) => {
     this.setState({
        list:data.crashList,
        noDebug:!this.hasDebugData(data.crashList)
      });
  }
  componentWillUnmount(){
    crashStore.unlisten(this.storeListener);
  }
  componentWillMount() {
    crashStore.get();
  }
  hasDebugData(list) {
    console.log(list);
    if (list && list.length > 0) {
      for (let i = 0; i < list.length; i++) {
        var trace = list[i].backtrace;
        for (let j = 0; j < trace.length; j++) {
          console.log(trace[j])
          if (trace[j].detail) {
            return true;
          }
        }
      }
    }
    return false;
  }
  downloadFile(fileName, urlData) {
    var replacedNewLines = urlData.replace(/\\n/g, '\n');
    var replacedTabs = replacedNewLines.replace(/\\t/g, '\t');
    var replacedQuotes= replacedTabs.replace(/\\"/g, '"');
    var textFileBlob = new Blob([replacedQuotes], {type: 'text/plain;charset=UTF-8'});
    var aLink = document.createElement('a');
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("click");
    aLink.download = fileName;
    aLink.href = window.URL.createObjectURL(textFileBlob);
    aLink.dispatchEvent(evt);
  }
  render() {
    let html;
    var list = null;
    if (this.state != null) {
      var tree = <div style={{'marginLeft':'auto', 'marginRight':'auto', 'width':'230px', 'padding':'90px'}}> No Debug Information Available </div>;
      if (!this.state.noDebug)
      {
        var tree = this.state.list && this.state.list.map((node, i) => {
                  var vm = node.name;
                  var vm_label = <span>{vm}</span>;
                  var backtrace = node.backtrace;
                  return (
                    <TreeView key={vm + '|' + i} nodeLabel={vm_label} defaultCollapsed={false}>
                      {backtrace.map(details => {

                        //Needed to decode HTML
                        var text_temp = document.createElement("textarea")
                        text_temp.innerHTML = details.detail;
                        var text_temp = text_temp.value;
                        var arr = text_temp.split(/\n/);
                        var text = [];
                        for (let i = 0; i < arr.length; i++) {
                          text.push(arr[i]);
                          text.push(<br/>)
                        }

                        return (
                          <TreeView nodeLabel={<span>{details.id}</span>} key={vm + '||' + details.id} defaultCollapsed={false}>
                            <p>{text}</p>
                          </TreeView>
                        );
                      })}
                    </TreeView>
                  );
                })}
      html = (
        <div className="crash-details-wrapper">
              <div className="form-actions">
                <button role="button" className="dark" onClick={this.state.noDebug ? false : this.downloadFile.bind(this, 'crash.txt', 'data:text;charset=UTF-8,' + decodeURIComponent(JSON.stringify(this.state.list, null, 2)))}> Download Crash Details</button>
              </div>
              <div className="crash-container">
                <h2> Debug Information </h2>
                <div className="tree">{tree}</div>
              </div>
        </div>
              );
    } else {
      html = <div className="crash-container"></div>
    };
    let refPage = window.sessionStorage.getItem('refPage');
    refPage = JSON.parse(refPage);
    return (
            <div className="crash-app">
              {html}
            </div>
            );
  }
}
export default CrashDetails;
