"use strict";

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

  // Initialize of the class in global namespace
  window.payments = class payments {
    /**
     * Сотрудники
     *
     * Сгенерировать и скачать excel-документ с зарплатами сотрудников за выбранный период (cookies или session storage)
     *
     * @return {void} Вызывает функцию скачивания в браузере
     */
    static workers = damper(() => {
      // Инициализация оболочки фильтров
      const filters = document.getElementById("filters").children[0];

      tasks
        .filter("from", new Date(filters.children[0].value) / 1000, null, true)
        .then(() => {
          tasks
            .filter(
              "to",
              new Date(filters.children[1].value) / 1000,
              null,
              true,
            )
            .then(() => {
              // Запрос к серверу
              fetch("/payments/workers", { method: "POST" }).then(
                (response) => {
                  if (response.ok) {
                    // Сервер вернул код успешного выполнения

                    response
                      .clone()
                      .json()
                      .then(
                        (data) => {
                          if (this.errors(data.errors)) {
                            // Сгенерированы ошибки
                          } else {
                            // Не сгенерированы ошибки (подразумевается их отсутствие)
                          }
                        },
                        () => {
                          // Инициализация имени файла
                          const header = response.headers.get(
                            "Content-Disposition",
                          );

                          if (header !== null) {
                            // Найден заголовок (подразумевается, что передан файл, а не случайная ошибка)
                            											
														// Инициализация названия файла
                            const name = header.split(";")[1].split("=")[1];

                            // Чтение полученного файла (подразумевается ошибка при инициализации json)
                            response.blob().then((blob) => {
                              // Инициализация временного элемента для скачивания с именем файла (хак)
                              const element = document.createElement("a");
                              element.href = window.URL.createObjectURL(blob);
                              element.download = name;
                              element.style.setProperty("display", "none");
                              document.body.appendChild(element);

                              // Скачивание файла
                              element.click();

                              // Деинициализация временного элемента
                              element.remove();
                            });
                          }
                        },
                      );
                  }
                },
              );
            });
        });
    }, 200);

    /**
     * Магазины
     *
     * Сгенерировать и скачать excel-документ со ... (сверкой?) за выбранный период (cookies или session storage)
     *
     * @return {void} Вызывает функцию скачивания в браузере
     */
    static markets = damper(() => {
      // Инициализация оболочки фильтров
      const filters = document.getElementById("filters").children[0];

      tasks
        .filter("from", new Date(filters.children[0].value) / 1000, null, true)
        .then(() => {
          tasks
            .filter(
              "to",
              new Date(filters.children[1].value) / 1000,
              null,
              true,
            )
            .then(() => {
              // Запрос к серверу
              fetch("/payments/markets", { method: "POST" }).then(
                (response) => {
                  if (response.ok) {
                    // Сервер вернул код успешного выполнения

                    response
                      .clone()
                      .json()
                      .then(
                        (data) => {
                          if (this.errors(data.errors)) {
                            // Сгенерированы ошибки
                          } else {
                            // Не сгенерированы ошибки (подразумевается их отсутствие)
                          }
                        },
                        () => {
                          // Инициализация имени файла
                          const header = response.headers.get(
                            "Content-Disposition",
                          );

                          if (header !== null) {
                            // Найден заголовок (подразумевается, что передан файл, а не случайная ошибка)

														// Инициализация названия файла
                            const name = header.split(";")[1].split("=")[1];

                            // Чтение полученного файла (подразумевается ошибка при инициализации json)
                            response.blob().then((blob) => {
                              // Инициализация временного элемента для скачивания с именем файла (хак)
                              const element = document.createElement("a");
                              element.href = window.URL.createObjectURL(blob);
                              element.download = name;
                              element.style.setProperty("display", "none");
                              document.body.appendChild(element);

                              // Скачивание файла
                              element.click();

                              // Деинициализация временного элемента
                              element.remove();
                            });
                          }
                        },
                      );
                  }
                },
              );
            });
        });
    }, 200);

    /**
     * Сгенерировать HTML-элемент со списком ошибок
     *
     * @param {object} registry Реестр ошибок
     * @param {bool} render Отобразить в окне с ошибками?
     * @param {bool} clean Очистить окно с ошибками перед добавлением?
     *
     * @return {bool} Сгенерированы ошибки?
     *
     * @TODO Переделать под показ ошибок где-нибудь
     */
    static errors(registry, render = true, clean = true) {
      // Инициализация ссылки на HTML-элемент с ошибками
      const wrap = document.body.contains(this.body.errors)
        ? this.body.errors
        : document.querySelector('[data-errors="true"]');

      if (wrap instanceof HTMLElement && document.body.contains(wrap)) {
        // Найден HTML-элемент с ошибками

        // Перерасчёт высоты элемента
        function height() {
          wrap.classList.remove("hidden");
          wrap.classList.remove("animation");
          // Реинициализация переменной с данными о высоте HTML-элемента (16 - это padding-top + padding-bottom у div#popup > section.errors)
          wrap.style.setProperty("--height", wrap.offsetHeight - 16 + "px");
          wrap.classList.add("animation");
          wrap.classList.add("hidden");
        }

        // Инициализация элемента-списка ошибок
        const list = wrap.getElementsByTagName("dl")[0];

        // Удаление ошибок из прошлой генерации
        if (clean) list.innerHTML = null;

        for (const error in registry) {
          // Генерация HTML-элементов с текстами ошибок

          // Инициализация HTML-элемента текста ошибки
          const samp = document.createElement("samp");

          if (typeof registry[error] === "object") {
            // Категория ошибок

            // Проверка наличия ошибок
            if (registry[error].length === 0) continue;

            // Инициализация HTML-элемента-оболочки
            const wrap = document.createElement("dt");

            // Запись текста категории
            samp.innerText = error;

            // Запись HTML-элементов в список
            wrap.appendChild(samp);
            list.appendChild(wrap);

            // Реинициализация высоты
            height();

            // Обработка вложенных ошибок (вход в рекурсию)
            this.errors(registry[error], false);
          } else {
            // Текст ошибки (подразумевается)

            // Инициализация HTML-элемента
            const wrap = document.createElement("dd");

            // Запись текста ошибки
            samp.innerText = registry[error];

            // Запись HTML-элемента в список
            wrap.appendChild(samp);
            list.appendChild(wrap);

            // Реинициализация высоты
            height();
          }
        }

        if (render) {
          // Запрошена отрисовка

          if (list.childElementCount !== 0) {
            // Найдены ошибки

            // Сброс анимации
            // УЛОВКА: таким образом не запускается анимация до взаимодействия с элементом (исправлял это в CSS, но не помню как)
            wrap.classList.add("animation");

            // Отображение
            wrap.classList.remove("hidden");
          } else {
            // Не найдены ошибки

            // Скрытие
            wrap.classList.add("hidden");
          }
        }

        return list.childElementCount === 0 ? false : true;
      }

      return false;
    }
  };
}

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