// Imports
import * as Auth from "/services/auth/auth.js";
import * as Common from "/services/common/common.js";
import * as ElectionModel from "/services/model/election-model.js";
import * as RoundModel from "/services/model/round-model.js";
import * as Messages from "/services/messages/messages.js";
import { Delete } from "/services/common/delete.js";

// DOM elements

export async function mount(where, parent) {
  const roundsComponent = new Round(parent);
  await roundsComponent.mount(where);
  return roundsComponent;
}

class Round {
  constructor(parent) {
    this.method = null;
    this.parent = parent;
    this.ElectionModel = ElectionModel.getElectionModel();
    this.RoundModel = RoundModel.getRoundModel();
  }

  async mount(where) {
    this.ElectionModel.current_user = await Auth.GetUser();
    this.RoundModel.current_user = await Auth.GetUser();
    this.RoundModel.refreshRounds();
    const mountpoint = where;
    document.getElementById(mountpoint).innerHTML = /* HTML */ `
      <header class="card-header">
        <p class="card-header-title">
          Tours
        </p>
      </header>
      <div class="card-content">
        <div id="round-list" class="content">Liste des tours</div>
      </div>
    `;
    this.mountModal("round-modal");
    this.handleDom();
    await this.displayRounds();
  }

  handleDom() {
    let roundHandler = this;

    document
      .getElementById(`round-modal-close`)
      .addEventListener("click", function () {
        Common.toggleModal("round-modal", "round-modal-card");
      });
    document
      .getElementById(`round-modal-cancel`)
      .addEventListener("click", function () {
        Common.toggleModal("round-modal", "round-modal-card");
      });
    document
      .getElementById(`round-modal-save`)
      .addEventListener("click", async function () {
        if (document.getElementById("round-modal-election-id").value === "0") {
          Messages.Show("is-danger", "Veuillez sélectionner une élection.");
          return;
        }
        await roundHandler.saveRound();
      });
  }

  async refreshElections() {
    let selectElection = document.getElementById("round-modal-election-id");
    let elections = await this.ElectionModel.getElections();
    for (let i = selectElection.options.length - 1; i >= 0; i--) {
      selectElection.remove(i);
    }

    let el = document.createElement("option");
    el.textContent = "Veuillez sélectionner une élection";
    el.value = 0;
    selectElection.appendChild(el);
    elections.forEach((election) => {
      el = document.createElement("option");
      el.textContent = election.Name;
      el.value = election.ID;
      selectElection.appendChild(el);
    });
  }

  mountModal(where) {
    const mountpoint = where;
    document.getElementById(mountpoint).innerHTML = /* HTML */ `
      <div class="modal-background"></div>
      <div class="modal-card" id="round-modal-card">
        <header class="modal-card-head">
          <p class="modal-card-title">Ajout/modification d'un tour</p>
          <button
            class="delete"
            aria-label="close"
            id="round-modal-close"
          ></button>
        </header>
        <section class="modal-card-body">
          <div class="field">
            <label>Id</label>
            <div class="control">
              <input class="input" type="number" id="round-modal-id" disabled />
            </div>
          </div>
          <div class="field">
            <label>Tour de l'élection</label><br />
            <div class="control select">
              <select name="ballot-type" id="round-modal-election-id"></select>
            </div>
          </div>
          <div class="field">
            <label>Date</label>
            <div class="control">
              <input class="input" type="date" id="round-modal-date" />
            </div>
          </div>
          <div class="field">
            <label>Tour n°</label>
            <div class="control">
              <input class="input" type="number" id="round-modal-round" />
            </div>
          </div>
        </section>
        <footer class="modal-card-foot">
          <button id="round-modal-save" class="button is-success">
            Sauvegarder
          </button>
          <button id="round-modal-cancel" class="button">Annuler</button>
        </footer>
      </div>
    `;
  }

  async displayRounds() {
    document.getElementById("round-list").innerHTML = /* HTML */ `<button
      id="round-new"
      class="button large-button is-success"
    >
      <span class="icon is-small">
        <i class="fas fa-plus"></i>
      </span>
    </button>`;
    let rounds = await this.RoundModel.getRounds();
    const markup = rounds.map((round) => this.roundTemplate(round)).join("");
    document.getElementById("round-list").innerHTML += markup;

    let roundHandler = this;
    rounds.map(async (round) => {
      document
        .getElementById(`rounds-round-edit-${round.ID}`)
        .addEventListener("click", function () {
          roundHandler.editRound(round);
        });
      let election = await this.ElectionModel.getElection(round.ElectionID);
      document.getElementById(`rounds-round-desc-${round.ID}`).innerHTML =
        election.Name +
        " " +
        document.getElementById(`rounds-round-desc-${round.ID}`).innerHTML;
      document
        .getElementById(`rounds-round-delete-${round.ID}`)
        .addEventListener("click", function () {
          new Delete(() => {
            roundHandler.deleteRound(round);
          });
        });
      document
        .getElementById(`rounds-round-${round.ID}`)
        .addEventListener("click", async function () {
          roundHandler.activateRound(round);
        });
    });

    document.getElementById(`round-new`).addEventListener("click", () => {
      this.newRound();
    });
  }

  roundTemplate(round) {
    return /* HTML */ `<div class="card card-list">
      <div id="rounds-round-${round.ID}" class="card-content clickable">
        <div class="content">
          <nav class="level">
            <div id="rounds-round-desc-${round.ID}" class="level-left">
              (tour : ${round.Round}, date :
              ${new Date(round.Date).toLocaleDateString()})
            </div>
            <div class="level-right">
              <a
                id="rounds-round-edit-${round.ID}"
                class="button is-link is-small"
                title="Modifier"
              >
                <span class="icon is-small">
                  <i class="fas fa-pen"></i>
                </span>
              </a>
              <a
                id="rounds-round-delete-${round.ID}"
                class="button is-danger is-small"
                title="Supprimer"
              >
                <span class="icon is-small">
                  <i class="fas fa-times"></i>
                </span>
              </a>
            </div>
          </nav>
        </div>
      </div>
    </div>`;
  }

  async activateRound(roundToActivate) {
    let election = await this.ElectionModel.getElection(
      roundToActivate.ElectionID
    );
    document.getElementById("candidate-list-title").innerHTML =
      "Liste des candidats par circonscription (" +
      election.Name +
      ", tour : " +
      roundToActivate.Round +
      ", date : " +
      new Date(roundToActivate.Date).toLocaleDateString() +
      ")";
    document.getElementById("desk-round-title").innerHTML =
      "Bureaux de votes (" +
      election.Name +
      ", tour : " +
      roundToActivate.Round +
      ", date : " +
      new Date(roundToActivate.Date).toLocaleDateString() +
      ")";
    this.parent.deskRoundsHandler.round = roundToActivate;
    await this.parent.deskRoundsHandler.displayDesks();
    this.parent.candidateListHandler.round = roundToActivate;
    await this.parent.candidateListHandler.displayAreas();
    this.hideRounds();
  }

  async newRound() {
    this.method = "POST";
    await this.refreshElections();
    document.getElementById("round-modal-id").value = null;
    document.getElementById("round-modal-date").value = null;
    document.getElementById("round-modal-round").value = null;
    Common.toggleModal("round-modal", "round-modal-card");
  }

  async editRound(round) {
    this.method = "PUT";
    await this.refreshElections();
    document.getElementById("round-modal-id").value = round.ID;
    document.getElementById("round-modal-election-id").value = round.ElectionID;
    document.getElementById("round-modal-date").value = new Date(round.Date)
      .toISOString()
      .split("T")[0];
    document.getElementById("round-modal-round").value = round.Round;
    Common.toggleModal("round-modal", "round-modal-card");
  }

  async saveRound() {
    if (this.method == "POST")
      document.getElementById("round-modal-id").value = null;

    let round = await this.RoundModel.saveRound(
      this.method,
      parseInt(document.getElementById("round-modal-id").value),
      parseInt(document.getElementById("round-modal-election-id").value),
      document.getElementById("round-modal-date").value,
      parseInt(document.getElementById("round-modal-round").value)
    );
    await this.displayRounds();
    Common.toggleModal("round-modal", "round-modal-card");
    this.activateRound(round);
    return round;
  }

  async deleteRound(round) {
    await this.RoundModel.deleteRound(round.ID);
    document.getElementById("display-rounds").click();
    document
      .getElementById("candidate-list-new")
      .setAttribute("disabled", "true");
  }

  hideRounds() {
    let roundsHandler = this;
    document.getElementById("rounds-list").innerHTML =
      '<p id="display-rounds">Afficher la liste des tours</p>';
    document.getElementById("rounds-list").className = "upper-text";
    document.getElementById("rounds-list").parentElement.className =
      "column upper-text";
    document.getElementById("candidate-lists").parentElement.className =
      "column is-full";
    document
      .getElementById("display-rounds")
      .addEventListener("click", async function () {
        await roundsHandler.mount("rounds-list");
        document.getElementById("rounds-list").className = "card";
        document.getElementById("rounds-list").parentElement.className =
          "column is-full";
        document.getElementById("candidate-lists").parentElement.className =
          "column";
      });
  }
}