/**
 * @module module/leasing-scaffold-sk
 * @description <h2><code>leasing-scaffold-sk</code></h2>
 *
 * <p>
 *   Contains the title bar and error-toast for all the leasing server pages.
 *   The rest of pages should be a child of this element.
 * </p>
 *
 */

import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';

import 'elements-sk/error-toast-sk';
import 'elements-sk/icon/folder-icon-sk';
import 'elements-sk/icon/account-box-icon-sk';
import 'elements-sk/icon/group-icon-sk';
import 'elements-sk/icon/help-icon-sk';
import 'elements-sk/icon/home-icon-sk';

import '../../../infra-sk/modules/app-sk';
import '../../../infra-sk/modules/login-sk';
import '../../../infra-sk/modules/theme-chooser-sk';

/**
 * Moves the elements from one NodeList to another NodeList.
 *
 * @param {NodeList} from - The list we are moving from.
 * @param {NodeList} to - The list we are moving to.
 */
function move(from: HTMLCollection | NodeList, to: HTMLElement) {
  Array.prototype.slice.call(from).forEach((ele) => to.appendChild(ele));
}

export class LeasingScaffoldSk extends ElementSk {
  private main: HTMLElement | null = null;

  constructor() {
    super(LeasingScaffoldSk.template);
  }

  private static template = (ele: LeasingScaffoldSk) => html`
  <app-sk>
    <header>
      <h1 class=name>${ele.appTitle}</h1>
      <div class="spacer"></div>
      <login-sk></login-sk>
      <theme-chooser-sk></theme-chooser-sk>
    </header>

    <aside class="surface-themes-sk">
      <nav>
        <a href="/" tab-index=0 ><home-icon-sk></home-icon-sk><span>Lease Bots</span></a>
        <a href="/my_leases" tab-index=0 ><account-box-icon-sk></account-box-icon-sk><span>My Leases<span></a>
        <a href="/all_leases" tab-index=0 ><group-icon-sk></group-icon-sk><span>All Leases<span></a>
        <a href="https://goto.google.com/skolo-leasing" tab-index=0 ><help-icon-sk></help-icon-sk><span>Docs</span></a>
        <a href="https://github.com/google/skia-buildbot/tree/master/leasing" tab-index=0 ><folder-icon-sk></folder-icon-sk><span>Code</span></a>
      </nav>
    </aside>

    <main></main>

    <footer>
      <error-toast-sk></error-toast-sk>
    <footer>
  <app-sk>
`;

  connectedCallback(): void {
    super.connectedCallback();
    // Don't call more than once.
    if (this.main) {
      return;
    }
    // We aren't using shadow dom so we need to manually move the children of
    // leasing-scaffold-sk to be children of 'main'. We have to do this for the
    // existing elements and for all future mutations.

    // Create a temporary holding spot for elements we're moving.
    const div = document.createElement('div');
    move(this.children, div);

    // Now that we've moved all the old children out of the way we can render
    // the template.
    this._render();

    // Move the old children back under main.
    this.main = this.querySelector('main');
    if (this.main) {
      move(div.children, this.main);
    }

    // Move all future children under main also.
    const observer = new MutationObserver((mutList) => {
      mutList.forEach((mut) => {
        if (this.main) {
          move(mut.addedNodes, this.main);
        }
      });
    });
    observer.observe(this, { childList: true });
  }

  /** @prop appTitle {string} Reflects the app_title attribute for ease of use. */
  get appTitle(): string { return this.getAttribute('app_title') || ''; }

  set appTitle(val: string) { this.setAttribute('app_title', val); }

  disconnectedCallback(): void {
    super.disconnectedCallback();
  }
}

define('leasing-scaffold-sk', LeasingScaffoldSk);
