/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import {Selectable} from "./tobago-selectable";

export class Tree extends HTMLElement {

  constructor() {
    super();
  }

  connectedCallback() {
  };

  get isSheet(): boolean {
    // TODO if sheet is implemented as custom element use:
    // return this.tagName === "TOBAGO-SHEET";
    return this.classList.contains("tobago-sheet");
  }

  clearSelectedNodes(): void {
    this.hiddenInputSelected.value = "[]"; //empty set
  }

  addSelectedNode(selectedNode: number): void {
    const selectedNodes = new Set(JSON.parse(this.hiddenInputSelected.value));
    selectedNodes.add(selectedNode);
    this.hiddenInputSelected.value = JSON.stringify(Array.from(selectedNodes));
  }

  deleteSelectedNode(selectedNode: number): void {
    const selectedNodes = new Set(JSON.parse(this.hiddenInputSelected.value));
    selectedNodes.delete(selectedNode);
    this.hiddenInputSelected.value = JSON.stringify(Array.from(selectedNodes));
  }

  private get hiddenInputSelected(): HTMLInputElement {
    if (this.isSheet) {
      return this.querySelector(":scope > .tobago-sheet-selected");
    } else {
      return this.querySelector(":scope > .tobago-tree-selected");
    }
  }

  clearExpandedNodes(): void {
    this.hiddenInputExpanded.value = "[]"; //empty set
  }

  addExpandedNode(expandedNode: number): void {
    const expandedNodes = new Set(JSON.parse(this.hiddenInputExpanded.value));
    expandedNodes.add(expandedNode);
    this.hiddenInputExpanded.value = JSON.stringify(Array.from(expandedNodes));
  }

  deleteExpandedNode(expandedNode: number): void {
    const expandedNodes = new Set(JSON.parse(this.hiddenInputExpanded.value));
    expandedNodes.delete(expandedNode);
    this.hiddenInputExpanded.value = JSON.stringify(Array.from(expandedNodes));
  }

  get expandedNodes(): Set<number> {
    return new Set(JSON.parse(this.hiddenInputExpanded.value));
  }

  private get hiddenInputExpanded(): HTMLInputElement {
    if (this.isSheet) {
      return this.querySelector(":scope > .tobago-sheet-expanded");
    } else {
      return this.querySelector(":scope > .tobago-tree-expanded");
    }
  }

  get selectable(): Selectable {
    return Selectable[this.getAttribute("selectable")];
  }
}

export class TreeNode extends HTMLElement {

  constructor() {
    super();
  }

  connectedCallback() {
    if (this.isExpandable() && this.toggles !== null) {
      this.toggles.forEach(element => element.addEventListener("click", this.toggleNode.bind(this)));
    }
  }

  get tree(): Tree {
    return this.closest("tobago-tree") as Tree; //TODO how to detect tobago-sheet?
  }

  isExpandable(): boolean {
    return this.getAttribute("expandable") === "expandable";
  }

  isExpanded(): boolean {
    for (const expandedNodeIndex of this.tree.expandedNodes) {
      if (expandedNodeIndex === this.index) {
        return true;
      }
    }
    return false;
  }

  get treeChildNodes(): NodeListOf<TreeNode> {
    if (this.tree.isSheet) {
      return this.closest("tbody").querySelectorAll("tobago-tree-node[parent='" + this.id + "']");
    } else {
      return this.parentElement.querySelectorAll("tobago-tree-node[parent='" + this.id + "']");
    }
  }

  get toggles(): NodeListOf<HTMLSpanElement> {
    return this.querySelectorAll(".tobago-treeNode-toggle");
  }

  get icons(): NodeListOf<HTMLElement> {
    return this.querySelectorAll(".tobago-treeNode-toggle i");
  }

  get images(): NodeListOf<HTMLImageElement> {
    return this.querySelectorAll(".tobago-treeNode-toggle img");
  }

  get index(): number {
    return Number(this.getAttribute("index"));
  }

  toggleNode(event: MouseEvent): void {
    if (this.isExpanded()) {
      for (const icon of this.icons) {
        icon.classList.remove(icon.dataset.tobagoOpen);
        icon.classList.add(icon.dataset.tobagoClosed);
      }
      for (const image of this.images) {
        if (image.dataset.tobagoClosed) {
          image.src = image.dataset.tobagoClosed;
        } else {
          image.src = image.dataset.tobagoOpen;
        }
      }

      this.tree.deleteExpandedNode(this.index);
      this.classList.remove("tobago-treeNode-markup-expanded");

      this.hideNodes(this.treeChildNodes);
    } else {
      for (const icon of this.icons) {
        icon.classList.remove(icon.dataset.tobagoClosed);
        icon.classList.add(icon.dataset.tobagoOpen);
      }
      for (const image of this.images) {
        if (image.dataset.tobagoOpen) {
          image.src = image.dataset.tobagoOpen;
        } else {
          image.src = image.dataset.tobagoClosed;
        }
      }

      this.tree.addExpandedNode(this.index);
      this.classList.add("tobago-treeNode-markup-expanded");

      if (this.treeChildNodes.length === 0) {
        jsf.ajax.request(
            this.id,
            event,
            {
              //"javax.faces.behavior.event": "click",
              execute: this.tree.id,
              render: this.tree.id
            });
      } else {
        this.showNodes(this.treeChildNodes);
      }
    }
  }

  hideNodes(treeChildNodes: NodeListOf<TreeNode>): void {
    for (const treeChildNode of treeChildNodes) {

      if (treeChildNode.tree.isSheet) {
        treeChildNode.closest("tobago-sheet-row").classList.add("d-none");
      } else {
        treeChildNode.classList.add("d-none");
      }

      this.hideNodes(treeChildNode.treeChildNodes);
    }
  }

  showNodes(treeChildNodes: NodeListOf<TreeNode>) {
    for (const treeChildNode of treeChildNodes) {

      if (treeChildNode.tree.isSheet) {
        treeChildNode.closest("tobago-sheet-row").classList.remove("d-none");
      } else {
        treeChildNode.classList.remove("d-none");
      }

      this.showNodes(treeChildNode.treeChildNodes);
    }
  }
}

export class TreeSelect extends HTMLElement {

  constructor() {
    super();
  }

  connectedCallback() {
    this.input.addEventListener("change", this.select.bind(this));

    if (this.tree.selectable === Selectable.multiCascade) {
      this.input.addEventListener("change", this.selectChildren.bind(this));
    }
  }

  get tree(): Tree {
    return this.closest("tobago-tree") as Tree;
  }

  get treeNode(): TreeNode {
    return this.closest("tobago-tree-node") as TreeNode;
  }

  get input(): HTMLInputElement {
    return this.querySelector("input");
  }

  select(event: Event): void {
    switch (this.input.type) {
      case "radio":
        this.tree.clearSelectedNodes();
        this.tree.addSelectedNode(this.treeNode.index);
        break;
      case "checkbox":
        if (this.input.checked) {
          this.tree.addSelectedNode(this.treeNode.index);
        } else {
          this.tree.deleteSelectedNode(this.treeNode.index);
        }
        break;
    }
  }

  selectChildren(event: Event): void {
    for (const treeChildNode of this.treeNode.treeChildNodes) {
      const child: TreeSelect = treeChildNode.querySelector(":scope > tobago-tree-select");
      child.input.checked = this.input.checked;

      if (this.input.checked) {
        this.tree.addSelectedNode(child.treeNode.index);
      } else {
        this.tree.deleteSelectedNode(child.treeNode.index);
      }

      child.input.dispatchEvent(new Event("change", {bubbles: true}));
    }
  }
}

document.addEventListener("DOMContentLoaded", function (event) {
  window.customElements.define("tobago-tree-select", TreeSelect);
  window.customElements.define("tobago-tree-node", TreeNode);
  window.customElements.define("tobago-tree", Tree);
});
