"use strict";

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

  // Initialize of the class in global namespace
  window.buffer = class buffer {
    /**
     * Записать в буфер
     *
     * @param {string} name Название
     * @param {string|number} value Значение
     *
     * @return {Promise}
     */
    static async write(name, value) {
      if (
        typeof core === "function" && typeof name === "string" &&
        (typeof value === "string" || typeof value === "number")
      ) {
        // Инициализировано ядро и переданы название со значением

        // Инициализация даты удаления cookie
        const expires = new Date();

        // Расчёт даты удаления (через 1 час после создания)
        expires.setTime(expires.getTime() + 3600000);

        // Запись в cookie
        Cookies.set(name, value, {
          expires,
          path: "/",
          secure: true,
          httponly: false,
          samesite: "strict",
        });

        // Запрос к серверу для записи в сессию (базу данных)
        return await fetch("/session/write", {
          method: "POST",
          headers: {
            "Content-Type": "application/x-www-form-urlencoded",
          },
          body: `name=${name}&value=${value}`,
        });
      }
    }

    /**
     * Прочитать из буфера
     *
     * @param {string} name Название
     *
     * @return {mixed}
     */
    static async read(name) {
      if (typeof core === "function" && typeof name === "string") {
        // Инициализировано ядро и переданы название со значением

        // Запрос к серверу для чтения из сессии (базы данных)
        return await fetch("/session/read", {
          method: "POST",
          headers: {
            "Content-Type": "application/x-www-form-urlencoded",
          },
          body: `name=${name}`,
        })
          .then((response) => response.text())
          .then((data) => {
            return data.length > 0
              ? data
              : Cookies.get(`buffer_${core.interface}_${name}`);
          });
      }
    }
  };
}

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