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

function OpenFileHandler() {
  console.log('Will open a dialog box ...');
  const options = {
    title: 'Open a file or folder',
  };
  let x = dialog.showOpenDialogSync(options) + '';  // Convert to string
  console.log('file name: ' + 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();
}

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