"use strict";

if (typeof window.session !== "function") {
  // Not initialized

  // Initialize of the class in global namespace
  window.session = class session {
    /**
     * Отправить номер на сервер
     *
     * Записывает номер в сессию, а так же проверяет существование аккаунта с ним
     *
     * @param {string} number Номер
     *
     * @return {object} {(bool) exist, (array) errors}
     */
    static async worker(number) {
      // Запрос к серверу
      return await fetch("/session/worker", {
        method: "POST",
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
        body: `worker=${number}&remember=1&return=exist,verify,errors`,
      })
        .then((response) => response.json())
        .then((data) => {
          return data;
        });
    }

    /**
     * Отправить идентификатор администратора на сервер
     *
     * Записывает идентификатор оператора в сессию,
     * а так же проверяет существование аккаунта с ним
     *
     * @param {string} _key Идентификатор оператора
     *
     * @return {object} {(bool) exist, (array) errors}
     */
    static async administrator(_key) {
      // Запрос к серверу
      return await fetch("/session/administrator", {
        method: "POST",
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
        body: `administrator=${_key}&remember=1&return=exist,verify,errors`,
      })
        .then((response) => response.json())
        .then((data) => {
          return data;
        });
    }

    /**
     * Отправить идентификатор оператора на сервер
     *
     * Записывает идентификатор оператора в сессию,
     * а так же проверяет существование аккаунта с ним
     *
     * @param {string} _key Идентификатор оператора
     *
     * @return {object} {(bool) exist, (array) errors}
     */
    static async operator(_key) {
      // Запрос к серверу
      return await fetch("/session/operator", {
        method: "POST",
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
        body: `operator=${_key}&remember=1&return=exist,verify,errors`,
      })
        .then((response) => response.json())
        .then((data) => {
          return data;
        });
    }

    /**
     * Отправить идентификатор магазина на сервер
     *
     * Записывает идентификатор магазина в сессию,
     * а так же проверяет существование аккаунта с ним
     *
     * @param {string} id Идентификатор магазина
     *
     * @return {object} {(bool) exist, (array) errors}
     */
    static async market(id) {
      // Запрос к серверу
      return await fetch("/session/market", {
        method: "POST",
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
        body: `market=${id}&remember=1&return=exist,verify,errors`,
      })
        .then((response) => response.json())
        .then((data) => {
          return data;
        });
    }

    /**
     * Отправить пароль на сервер
     *
     * Записывает пароль в сессию, а так же проверяет его на соответствование требованиям
     *
     * @param {string} password Пароль
     *
     * @return {object} {(bool) verify, (bool) account, (array) errors}
     */
    static async password(password) {
      // Инициализация названия поддомена
      const subdomain = window.location.host.split(".")[0];

      // Инициализация типа аккаунта
      const type = subdomain === "xn--80aksgi6f"
        ? "worker"
        : (subdomain === "xn--80aj0acchco"
          ? "operator"
          : (subdomain === "xn--80aairftm" ? "market" : "worker"));

      // Запрос к серверу
      return await fetch("/session/password", {
        method: "POST",
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
        body:
          `password=${password}&type=${type}&remember=1&return=account,verify,errors`,
      })
        .then((response) => response.json())
        .then((data) => {
          return data;
        });
    }
  };
}

// Вызов события: "инициализировано"
document.dispatchEvent(
  new CustomEvent("session.initialized", {
    detail: { session: window.session },
  }),
);
