import '../web_modules/ContentTools/build/content-tools.min.js';

window.addEventListener('DOMContentLoaded', () => {
  let editor = ContentTools.EditorApp.get();
  editor.init('*[data-editable]', 'data-name');

  editor.addEventListener('saved', async function (ev) {
    document.getElementById("warning-panel").close();

    let {regions} = ev.detail();
    if (Object.getOwnPropertyNames(regions).length === 0) {
      // Nothing changed.
      return;
    }

    this.busy(true);

    let requestParams = new URLSearchParams();
    for (let name of Object.getOwnPropertyNames(regions)) {
      requestParams.append(name, regions[name]);
    }

    let {pageTitle} = document.getElementById('wiki-page').dataset;

    let response = await fetch(`/wiki/${pageTitle}`, {
      method: 'POST',
      body: requestParams
    });

    if (!response.ok) {
      document.getElementById("warning-panel").open();
      document.getElementById("warning-text").innerText = `Failed to save page: ${response.statusText}`;
      this.busy(false);

return;
    }

    let status = await response.json();
    if (status.status !== "ok") {
      document.getElementById("warning-panel").open();
      document.getElementById("warning-text").innerText = `Failed to save page: ${JSON.stringify(status)}`;
      this.busy(false);

return;
    }

    if (status.hasOwnProperty("content")) {
      document.getElementById("wiki-content").innerHTML = status.content;
    }

    this.busy(false);
  });
});
