import './ace-modes.js';
import './style.css';

import {Editors} from './editors';
import {Elm} from './elm/Main.elm';
import {Evaluator} from './evaluator';

// A message sent from Elm (see elm/Ports.elm).
interface ElmMessage {
  command: string;
  payload: any;
}

// Gets the user's light/dark preference (e.g. macOS Catalina Dark Mode).
function preferredColorScheme(): string {
  if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) {
    return 'dark';
  }
  return 'light';
}

function save(key: string, value: object) {
  localStorage.setItem(key, JSON.stringify(value));
}

function load(key: string): object | undefined {
  const item = localStorage.getItem(key);
  if (item == undefined) {
    return undefined;
  }
  return JSON.parse(item);
}

function main() {
  const app = Elm.Main.init({
    node: document.getElementById('Elm'),
    flags: {
      model: load('model'),
      preferredScheme: preferredColorScheme(),
    },
  });
  const editors = Editors.fromJSON(load('editors') as any);
  const evaluator = new Evaluator(editors, () => {
    save('editors', editors.toJSON());
  });

  app.ports.out.subscribe(({command, payload}: ElmMessage) => {
    switch (command) {
      case 'persistModel': {
        save('model', payload);
        break;
      }
      case 'clearDataAndReload': {
        localStorage.clear();
        window.location.reload();
        break;
      }
      case 'applySettings': {
        editors.applySettings(payload);
        evaluator.setRefreshDelay(payload.refreshDelay);
        const classes = document.getElementsByTagName('body')[0].classList;
        if (payload.scheme === 'dark') {
          classes.add('dark');
        } else {
          classes.remove('dark');
        }
        break;
      }
      case 'setMainTabEnabled': {
        const elements = document
          .getElementById('Main')
          // Exclude .navbar-item since they always have tabindex -1 (we provide
          // the keyboard shortcuts Ctrl-[ and Ctrl-] instead).
          ?.querySelectorAll('input,textarea,select,button:not(.navbar-item)');
        const tabIndex = payload ? 0 : -1;
        elements?.forEach(element => {
          (element as HTMLElement).tabIndex = tabIndex;
        });
        break;
      }
      case 'updateEditors': {
        editors.showSessions(payload.input, payload.output);
        evaluator.setActive(payload.input, payload.output, payload.options);
        evaluator.run();
        break;
      }
      case 'resizeEditors': {
        // Use requestAnimationFrame to give Elm time to render. The newly
        // rendered DOM might affect the size of the container to which the Ace
        // editors adjust when we call resize() on them.
        requestAnimationFrame(() => {
          editors.resize();
        });
        break;
      }
    }
  });

  evaluator.start();
}

// Load ace/mode/json first. Running main() eventually results in setting an
// editor mode to ace/mode/fidl, prompting Ace to execute the ace/mode/fidl
// definition function in ace-modes.js. This file imports some resources that
// are not exposed as separate files by the CDN, like ace/mode/behaviour/cstyle.
// By first loading ace/mode/json, these common resources get populated in Ace's
// internal map, so it won't attempt and fail to load them from the CDN.
(ace as any).config.loadModule('ace/mode/json', () => {
  main();
});
