// Глобальная Map для кеширования переводов
const translationCache = new Map();

/**
 * Загружает переводы для указанной локали с кешированием
 * Если переводы уже загружены - возвращает из кеша
 */
Cypress.Commands.add("loadTranslations", (locale: string = "ru") => {
  // Проверяем есть ли уже переводы в кеше для этой локали
  if (translationCache.has(locale)) {
    cy.log(`Переводы для локали "${locale}" уже загружены, используем кеш`);
    return cy.wrap(translationCache.get(locale));
  }

  cy.log(`Загружаем переводы для локали: ${locale}`);

  // Делаем HTTP запрос к файлу перевода
  return cy
    .request({
      url: `/locales/${locale}.json`,
      failOnStatusCode: true,
    })
    .then((response) => {
      // Проверяем что запрос успешен
      if (response.status !== 200) {
        throw new Error(`Не удалось загрузить переводы для локали ${locale}. Status: ${response.status}`);
      }

      // Проверяем что ответ содержит данные
      if (!response.body || typeof response.body !== "object") {
        throw new Error(`Получен некорректный ответ для локали ${locale}`);
      }

      // Сохраняем переводы в кеш
      translationCache.set(locale, response.body);
      cy.log(
        `Переводы для локали "${locale}" успешно загружены и закешированы. Ключей: ${Object.keys(response.body).length}`
      );

      return cy.wrap(response.body);
    });
});

/**
 * Получает конкретный перевод по ключу с использованием кеша
 */
Cypress.Commands.add("getTranslation", (key: string, locale: string = "ru") => {
  // Сначала загружаем переводы (использует кеш если уже загружены)
  return cy.loadTranslations(locale).then((translations) => {
    // Проверяем что ключ существует в переводах
    if (!translations.hasOwnProperty(key)) {
      const availableKeys = Object.keys(translations).join(", ");
      throw new Error(`Ключ перевода "${key}" не найден в локали "${locale}". Доступные ключи: ${availableKeys}`);
    }

    const translatedText = translations[key];
    cy.log(`Перевод для ключа "${key}" в локали "${locale}": "${translatedText}"`);

    return cy.wrap(translatedText as unknown as string);
  });
});

/**
 * Проверяет что элемент содержит правильный перевод
 */
Cypress.Commands.add("shouldHaveTranslation", (selector: string, key: string, locale: string = "ru") => {
  // Получаем ожидаемый текст через кешированные переводы
  cy.getTranslation(key, locale).then((expectedText) => {
    // Проверяем что элемент содержит ожидаемый текст
    cy.get(selector).should("contain", expectedText);
  });
});
