// Imports
import * as Auth from "/services/auth/auth.js";
import * as Common from "/services/common/common.js";
import * as DeskModel from "/services/model/desk-model.js";
import * as DeskRoundModel from "/services/model/deskRound-model.js";
import * as CapturerModel from "/services/model/capturer-model.js";
import * as Messages from "/services/messages/messages.js";

// DOM elements

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

class RoundDesk {
  constructor(parent) {
    this.parent = parent;
    this.DeskModel = DeskModel.getDeskModel();
    this.DeskRoundModel = DeskRoundModel.getDeskRoundModel();
    this.CapturerModel = CapturerModel.getCapturerModel();
  }

  async mount(where) {
    this.DeskModel.current_user = await Auth.GetUser();
    this.DeskRoundModel.current_user = await Auth.GetUser();
    this.CapturerModel.current_user = await Auth.GetUser();
    const mountpoint = where;
    document.getElementById(mountpoint).innerHTML = /* HTML */ `
      <header class="card-header">
        <p id="desk-round-title" class="card-header-title">
          Bureaux de votes
        </p>
      </header>
      <div class="columns card-content">
        <div class="column">
          <div id="desk-rounds"></div>
        </div>
        <div class="column">
          <div id="desk-round-details"></div>
        </div>
        <div class="column is-half">
          <div id="vote-list" class="card"></div>
        </div>
      </div>
    `;
    this.mountModal("capturers-modal");
    this.handleDom();
  }

  handleDom() {
    let roundHandler = this;
    document
      .getElementById(`round-new`)
      .addEventListener("click", function () {});

    document
      .getElementById(`capturers-modal-close`)
      .addEventListener("click", function () {
        Common.toggleModal("capturers-modal", "capturers-modal-card");
      });
  }

  mountModal(where) {
    const mountpoint = where;
    document.getElementById(mountpoint).innerHTML = /* HTML */ `
      <div class="modal-background"></div>
      <div class="modal-card" id="capturers-modal-card">
        <header class="modal-card-head">
          <p class="modal-card-title">Ajout/supression de saisisseurs</p>
          <button
            class="delete"
            aria-label="close"
            id="capturers-modal-close"
          ></button>
        </header>
        <section class="modal-card-body">
          <div class="columns">
            <div class="column">
              <header class="card-header card-header-success">
                <p class="card-header-title">
                  Saisisseurs actifs
                </p>
              </header>
              <div id="active-capturers">
                Liste des saisisseurs actif
              </div>
            </div>
            <div class="column">
              <header class="card-header card-header-danger">
                <p class="card-header-title">
                  Saisisseurs disponibles
                </p>
              </header>

              <div id="available-capturers""> Liste des saisseurs disponibles
            </div>
          </div>
        </section>
      </div>
    `;
  }

  deskRoundTemplate(deskRound) {
    return /* HTML */ `<div class="card card-list">
      <div id="deskrounds-deskround-${deskRound.ID}" class="card-content">
        <div class="content">
          <nav class="level">
            <div
              id="deskrounds-deskround-desc-${deskRound.ID}"
              class="level-left"
            ></div>
            <div class="level-right">
              <a
                id="deskrounds-deskround-capturers-${deskRound.ID}"
                class="button is-link is-small"
                title="Saisisseurs"
              >
                <span class="icon is-small">
                  <i class="fas fa-user"></i>
                </span>
              </a>
            </div>
          </nav>
        </div>
      </div>
    </div>`;
  }

  deskRoundDetailsTemplate() {
    return /* HTML */ `<div>
      <section class="modal-card-body">
        <div class="field">
          <div class="control">
            <label class="checkbox" disabled>
              <input
                class="input"
                type="checkbox"
                id="deskround-completed"
                ${this.deskRound.Completed ? 'checked="true"' : ""}
                disabled
              />
              Complété
              ${this.deskRound.Completed
                ? "(" +
                  new Date(this.deskRound.DateCompletion).toLocaleDateString() +
                  ")"
                : ""}
            </label>
          </div>
        </div>
        <div class="field">
          <div class="control">
            <label
              class="checkbox"
              ${!this.deskRound.Completed ? 'disabled="true"' : ""}
            >
              <input
                class="input"
                type="checkbox"
                id="deskround-validated"
                ${this.deskRound.Validated ? 'checked="true"' : ""}
                ${!this.deskRound.Completed ? 'disabled="true"' : ""}
              />
              Validé
            </label>
          </div>
        </div>
      </section>
      <footer class="modal-card-foot">
        <button id="deskround-save" class="button is-success">
          Sauvegarder
        </button>
        <button id="deskround-cancel" class="button">
          Annuler
        </button>
      </footer>
    </div>`;
  }

  capturersTemplate(capturer) {
    return /* HTML */ `<div class="card card-list">
      <div id="capturers-capturer-${capturer.ID}" class="card-content">
        <div class="content">
          <nav class="level">
            <div class="level-left">${capturer.Name}</div>
            <div class="level-right"></div>
          </nav>
        </div>
      </div>
    </div>`;
  }

  async displayDesks() {
    let deskRounds = await this.updateDeskRounds();
    const markup = deskRounds
      .map((deskRound) => this.deskRoundTemplate(deskRound))
      .join("");
    document.getElementById("desk-rounds").innerHTML = markup;

    let deskRoundHandler = this;
    deskRoundHandler.emptyDesksDetails();
    deskRounds.map(async (deskRound) => {
      let desk = await this.DeskModel.getDesk(deskRound.DeskID);
      document.getElementById(
        `deskrounds-deskround-desc-${deskRound.ID}`
      ).innerHTML = desk.Name;
      document
        .getElementById(`deskrounds-deskround-${deskRound.ID}`)
        .addEventListener("click", async function () {
          deskRoundHandler.activateDeskRound(deskRound);
          deskRoundHandler.deskRound = await deskRoundHandler.DeskRoundModel.getDeskRound(
            deskRound.ID
          );
          deskRoundHandler.displayDeskRoundsDetails();
        });
      document
        .getElementById(`deskrounds-deskround-capturers-${deskRound.ID}`)
        .addEventListener("click", function () {
          Common.toggleModal("capturers-modal", "capturers-modal-card");
          deskRoundHandler.refreshCapturers();
        });
    });
  }

  async displayDeskRoundsDetails() {
    document.getElementById(
      "desk-round-details"
    ).innerHTML = this.deskRoundDetailsTemplate();
    let deskRoundHandler = this;
    document
      .getElementById(`deskround-save`)
      .addEventListener("click", async function () {
        await deskRoundHandler.saveDeskRound();
      });
  }

  async activateDeskRound(deskRoundToActivate) {
    let deskRounds = await this.updateDeskRounds();
    deskRounds.forEach((deskRound) => {
      document
        .getElementById(`deskrounds-deskround-${deskRound.ID}`)
        .classList.remove("active-card");
    });
    document
      .getElementById(`deskrounds-deskround-${deskRoundToActivate.ID}`)
      .classList.add("active-card");
  }

  async updateDeskRounds() {
    let deskRoundHandler = this;
    let deskRounds = await this.DeskRoundModel.getDeskRounds();
    return deskRounds.filter(function (deskRound) {
      return deskRound.RoundID == deskRoundHandler.round.ID;
    });
  }

  async saveDeskRound() {
    try {
      this.DeskRoundModel.saveDeskRound(
        this.deskRound.ID,
        document.getElementById("deskround-validated").checked
      );
    } catch (e) {
      Messages.Show("is-warning", e.message);
      console.error(e);
      return;
    }
    this.displayDesks();
  }

  async refreshCapturers() {
    let deskRoundHandler = this;
    let capturersAvailable;
    let capturersActive;
    let capturers = await this.CapturerModel.getCapturers();
    capturersAvailable = capturers.filter(function (capturer) {
      let flag = true;
      capturer.DeskRounds.forEach((deskRound) => {
        if (deskRound.ID === deskRoundHandler.deskRound.ID) flag = false;
      });
      return flag;
    });
    capturersActive = capturers.filter(function (capturer) {
      let flag = false;
      capturer.DeskRounds.forEach((deskRound) => {
        if (deskRound.ID === deskRoundHandler.deskRound.ID) flag = true;
      });
      return flag;
    });

    let markup = capturersAvailable
      .map((capturer) => this.capturersTemplate(capturer))
      .join("");
    document.getElementById("available-capturers").innerHTML = markup;

    markup = capturersActive
      .map((capturer) => this.capturersTemplate(capturer))
      .join("");
    document.getElementById("active-capturers").innerHTML = markup;

    capturersAvailable.map(async (capturer) => {
      document
        .getElementById(`capturers-capturer-${capturer.ID}`)
        .addEventListener("click", async function () {
          await deskRoundHandler.CapturerModel.addCapturerToDesk(
            capturer.ID,
            deskRoundHandler.deskRound.ID
          );
          await deskRoundHandler.refreshCapturers();
        });
    });

    capturersActive.map(async (capturer) => {
      document
        .getElementById(`capturers-capturer-${capturer.ID}`)
        .addEventListener("click", async function () {
          await deskRoundHandler.CapturerModel.removeCapturerFromDesk(
            capturer.ID,
            deskRoundHandler.deskRound.ID
          );
          await deskRoundHandler.refreshCapturers();
        });
    });
  }

  emptyDesksDetails() {
    this.desk = null;
    document.getElementById("desk-round-details").innerHTML = "";
    document.getElementById("vote-list").innerHTML = "";
  }
}