const { ipcRenderer } = require('electron');
const { spawnSync } = require('child_process');
const md5File = require('md5-file');
const https = require('https');

ipcRenderer.on('filename', (event, x) => {
  // Determine file type
  let is_asio_log = false;
  const data = fs.readFileSync(x, {encoding: 'utf-8'});
  let lines = data.split('\n');
  for (let i = 0; i < lines.length; i++) {
    if (lines[i].indexOf('@asio') == 0) {
      is_asio_log = true;
      break;
    }
  }

  if (is_asio_log) {
    ShowBlocker('Loading Boost ASIO handler tracking log');
    console.log('This file is a Boost Asio handler tracking log');
    ParseBoostHandlerTimeline(data);
    OnGroupByConditionChanged_ASIO();
    if (boost_asio_handler_timeline_view.IsEmpty() == false) {
      boost_asio_handler_timeline_view.CurrentFileName = x;
      HideWelcomeScreen();
      ShowASIOTimeline();
      ShowNavigation();
      UpdateFileNamesString();
    }
    HideBlocker();
    return;
  }

  OpenDBusPcapFile(x);
  UpdateLayout();
});

function OpenFileHandler() {
  ipcRenderer.send('file-request');
}

// The file may be either DBus dump or Boost Asio handler log
document.getElementById('btn_open_file')
    .addEventListener('click', OpenFileHandler);
document.getElementById('btn_open_file2')
    .addEventListener('click', OpenFileHandler);

document.getElementById('bah1').addEventListener(
    'click', OnGroupByConditionChanged_ASIO);
document.getElementById('bah2').addEventListener(
    'click', OnGroupByConditionChanged_ASIO);
document.getElementById('bah3').addEventListener(
    'click', OnGroupByConditionChanged_ASIO);

// UI elements
var g_group_by_dbus = document.getElementById('span_group_by_dbus');
var g_group_by_ipmi = document.getElementById('span_group_by_ipmi');
var g_group_by_asio =
    document.getElementById('span_group_by_boost_asio_handler')
var g_canvas_ipmi = document.getElementById('my_canvas_ipmi');
var g_canvas_dbus = document.getElementById('my_canvas_dbus');
var g_canvas_asio = document.getElementById('my_canvas_boost_asio_handler');

var g_dbus_pcap_status_content = document.getElementById('dbus_pcap_status_content');
var g_dbus_pcap_error_content = document.getElementById('dbus_pcap_error_content');
var g_btn_download_dbus_pcap = document.getElementById('btn_download_dbus_pcap');
var g_welcome_screen_content = document.getElementById('welcome_screen_content');
var g_scapy_error_content = document.getElementById('scapy_error_content');

var g_btn_zoom_reset = document.getElementById('btn_zoom_reset');

function DownloadDbusPcap() {
  const url = 'https://raw.githubusercontent.com/openbmc/openbmc-tools/08ce0a5bad2b5c970af567c2e9888d444afe3946/dbus-pcap/dbus-pcap';

  https.get(url, (res) => {
    const path = 'dbus-pcap';
    const file_path = fs.createWriteStream(path);
    res.pipe(file_path);
    file_path.on('finish', () => {
      file_path.close();
      alert("dbus-pcap download complete!");
      CheckDbusPcapPresence();
    });
  });
}

g_btn_download_dbus_pcap.addEventListener(
  'click', DownloadDbusPcap);

function ShowDBusTimeline() {
  g_canvas_dbus.style.display = 'block';
  g_group_by_dbus.style.display = 'block';
}
function ShowIPMITimeline() {
  g_canvas_ipmi.style.display = 'block';
  g_group_by_ipmi.style.display = 'block';
}
function ShowASIOTimeline() {
  g_canvas_asio.style.display = 'block';
  g_group_by_asio.style.display = 'block';
}

// Make sure the user has scapy.all installed
function IsPythonInstallationOK() {
  const x = spawnSync('python3', ['-m', 'scapy.all']);
  return (x.status == 0);
}

function IsDbusPcapPresent() {
  // This should exist if the openbmc-tools repository
  // is checked out as a whole
  const dbus_pcap = '../dbus-pcap/dbus-pcap';

  if (fs.existsSync('dbus-pcap')) {
    return true;
  } else if (fs.existsSync(dbus_pcap)) { // Create symlink
    fs.symlinkSync(dbus_pcap, './dbus-pcap');
    return true;
  } else {
    return false;
  }
}

function CheckDependencies() {
  g_dbus_pcap_status_content.style.display = 'none';
  g_dbus_pcap_error_content.style.display = 'none';
  g_scapy_error_content.style.display = 'none';
  g_welcome_screen_content.style.display = 'none';

  const dbus_pcap_ok = IsDbusPcapPresent();
  if (!dbus_pcap_ok) {
    g_dbus_pcap_error_content.style.display = 'block';
  }

  const scapy_ok = IsPythonInstallationOK();
  if (!scapy_ok) {
    g_scapy_error_content.style.display = 'block';
  }

  let msg = "";
  if (dbus_pcap_ok) {
    msg += 'dbus-pcap found, md5sum: ' +
      md5File.sync('dbus-pcap');
    g_dbus_pcap_status_content.style.display = 'block';
    g_dbus_pcap_status_content.textContent = msg;
  }

  if (dbus_pcap_ok && scapy_ok) {
    g_welcome_screen_content.style.display = 'block';
  }
}

function Init() {
  console.log('[Init] Initialization');
  ipmi_timeline_view.Canvas = document.getElementById('my_canvas_ipmi');
  dbus_timeline_view.Canvas = document.getElementById('my_canvas_dbus');
  boost_asio_handler_timeline_view.Canvas =
      document.getElementById('my_canvas_boost_asio_handler');

  // Hide all canvases until the user loads files
  ipmi_timeline_view.Canvas.style.display = 'none';
  dbus_timeline_view.Canvas.style.display = 'none';
  boost_asio_handler_timeline_view.Canvas.style.display = 'none';

  let v1 = ipmi_timeline_view;
  let v2 = dbus_timeline_view;
  let v3 = boost_asio_handler_timeline_view;

  // Link views
  v1.linked_views = [v2, v3];
  v2.linked_views = [v1, v3];
  v3.linked_views = [v1, v2];

  // Set accent color
  v1.AccentColor = 'rgba(0,224,224,0.5)';
  v2.AccentColor = 'rgba(0,128,0,  0.5)';
  v3.AccentColor = '#E22';

  CheckDependencies();
}

var g_WelcomeScreen = document.getElementById('welcome_screen');
function HideWelcomeScreen() {
  g_WelcomeScreen.style.display = 'none';
}

var g_Blocker = document.getElementById('blocker');
var g_BlockerCaption = document.getElementById('blocker_caption');
function HideBlocker() {
  g_Blocker.style.display = 'none';
}
function ShowBlocker(msg) {
  g_Blocker.style.display = 'block';
  g_BlockerCaption.textContent = msg;
}

var g_Navigation = document.getElementById('div_navi_and_replay');
function ShowNavigation() {
  g_Navigation.style.display = 'block';
}

function UpdateFileNamesString() {
  let tmp = [];
  if (ipmi_timeline_view.CurrentFileName != '') {
    tmp.push('IPMI timeline: ' + ipmi_timeline_view.CurrentFileName)
  }
  if (dbus_timeline_view.CurrentFileName != '') {
    tmp.push('DBus timeline: ' + dbus_timeline_view.CurrentFileName)
  }
  if (boost_asio_handler_timeline_view.CurrentFileName != '') {
    tmp.push(
        'ASIO timeline: ' + boost_asio_handler_timeline_view.CurrentFileName);
  }
  let s = tmp.join('<br/>');
  document.getElementById('capture_info').innerHTML = s;
}

var g_cb_debug_info = document.getElementById('cb_debuginfo');


Init();
