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();

  DragElement(document.getElementById("highlighted_messages"));
}

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();