/*

* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS205: Consider reworking code to avoid use of IIFEs
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/

//= require websocket.coffee

import {showdown} from ‘./vendor/showdown.js’

$.extend(WSClient.prototype.actions, {

append(data) {
  let atBottom;
  this.__parent.check_target(data);
  let element = $(`#console-${data.target}`);
  const marginSize = 16;
  const atBottomStack = [];
  while (element.hasClass("pane")) {
    atBottom = (element.scrollTop() >= (element[0].scrollHeight - element.height() - marginSize - 2)) || ((element[0].scrollHeight - marginSize) < element.height());
    atBottomStack.push(atBottom);
    element = element.parent();
  }
  element = $(`#console-${data.target}`);
  element.append(this.__parent.escape(data.text, data));
  if (data.auto_scroll !== false) {
    return (() => {
      const result = [];
      while (element.hasClass("pane")) {
        atBottom = atBottomStack.shift();
        if (atBottom) { element.scrollTop(element[0].scrollHeight - element.height() - marginSize); }
        result.push(element = element.parent());
      }
      return result;
    })();
  }
},
replace(data) {
  this.__parent.check_target(data);
  return $(`#console-${data.target}`).html(this.__parent.escape(data.text, data));
},
clear(data) {
  this.__parent.check_target(data);
  return $(`#console-${data.target}`).html("");
}, // empty() is really slow for some reason
addpane(data) {
  let target;
  if (data.target) {
    target = this.__parent.check_target(data);
  } else {
    target = $('#panes');
  }
  if (target.find(`#console-${data.name}`).size() === 0) {
    const element = $(`<pre class='pane full-pane' id='console-${data.name}'><pre>`);
    element.attr('pane-weight', data.weight || 1);
    target.append(element);
  }
  return this.__parent.resize_panes(data);
},
closepane(data) {
  const target = $(`#console-${data.target}`);
  if (target.size() !== 0) {
    target.remove();
    return this.__parent.resize_panes(data);
  }
},
hidepane(data) {
  const target = this.__parent.check_target(data);
  target.addClass("hidden");
  target.removeClass("pane");
  return this.__parent.resize_panes({target_element:target.parent()});
},
showpane(data) {
  const target = this.__parent.check_target(data);
  target.addClass("pane");
  target.removeClass("hidden");
  return this.__parent.resize_panes(data);
},
reorient(data) {
  let target;
  if (data.target) {
    target = this.__parent.check_target(data);
  } else {
    target = $('#panes');
  }
  if (data.orientation === "horizontal") {
    target.addClass("horizontal");
  } else {
    target.removeClass("horizontal");
  }
  return this.__parent.resize_panes(data);
},
highlight(data) {
  const target = this.__parent.check_target(data);
  const code = $(`<code>${ansi_up.escape_for_html(data.text)}</code>`);
  if (data.language) { code.addClass(data.language); }
  this.__parent.add(code, target, data);
  return hljs.highlightBlock(code[0]);
},
markdown(data) {
  const target = this.__parent.check_target(data);
  const newblock = $("<div class='markdown'></div>");
  var converter = new showdown.Converter({
    tables: true,
    simplifiedAutoLink: true,
  })
  newblock.html(this.__parent.escape(converter.makeHtml(data.text), $.extend({escape_html:false, escape_icons:true}, data)));
  this.__parent.add(newblock, target, data);
  return Array.from(newblock.find('code')).map((code) => hljs.highlightBlock(code));
},
break(data) {
  const target = this.__parent.check_target(data);
  const code = $("<hr>");
  return this.__parent.add(code, target, data);
},
subpane(data) {
  const target = this.__parent.check_target(data);
  const element = target.find(`#console-${data.name}`);
  if (element.size() === 0) {
    let other_classes;
    if (data.fill) { other_classes = "subpane-fill"; }
    return target.append(`<pre id='console-${data.name}' class='subpane pane ${other_classes}'></pre>`);
  }
},
alert(data) {
  return alert(data.text);
},
title(data) {
  return document.title = data.title;
},
status(data) {
  return this.__parent.status.show_status(data);
},
layout(data) {
  return $("body").html(data.data);
},
script(data) {
  const r = eval(data.data);
  return this.__parent.send({
    id:data.id,
    action:'callback',
    source:'script',
    original_msg:data,
    result: r
    });
},
style(data) {
  const target = this.__parent.check_target(data);
  return target.css(data.attribute, data.value);
},
table(data) {
  const target = this.__parent.check_target(data);
  let html = "<table>";
  if (data.headers) {
    html += "<tr>";
    for (var header of Array.from(data.headers)) { html += `<th>${this.__parent.escape(header, data)}</th>`; }
    html += "<tr>";
  }
  for (var row of Array.from(data.rows)) {
    html += "<tr>";
    for (var cell of Array.from(row)) { html += `<td>${this.__parent.escape(cell, data)}</td>`; }
    html += "</tr>";
  }
  html += "</table>";
  html = $(html);
  if (data.interactive !== false) {
    html.delegate('td', 'mouseover mouseout', function() {
      const pos = $(this).index();
      return html.find(`td:nth-child(${(pos+1)})`).toggleClass("hover");
    });
  }
  return this.__parent.add(html, target, data);
},
focus(data) {
  return window.show();
},
close(data) {
  return window.close();
},
search(data) {
  if (window.find(data.text, 0, 0, 1)) {
    let anchor = window.getSelection().anchorNode;
    if (anchor.nodeType !== 1) { anchor = anchor.parentNode; }
    return anchor.scrollIntoView();
  }
}

} );