/// <reference types="cypress" />
import "../support/commands";

describe("Проверка apology page", () => {
  // Конфигурация тестов для разных языков
  const localeConfigs = [
    {
      locale: "ru",
      urlPrefix: "", // русский по умолчанию
      description: "русский (по умолчанию)",
    },
    {
      locale: "ru",
      urlPrefix: "/ru",
      description: "русский (явно указан)",
    },
    {
      locale: "en",
      urlPrefix: "/en",
      description: "английский",
    },
    {
      locale: "uz",
      urlPrefix: "/uz",
      description: "узбекский",
    },
  ];

  // Тестовые случаи с ожидаемыми ошибками
  const testCases = [
    {
      name: "неопубликованный квиз",
      path: "/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659",
      expectedError: "quiz is inactive",
    },
    {
      name: "опубликованный квиз без вопросов",
      path: "/228df092-1f9b-4c04-b08d-08726f0ef223",
      expectedError: "no questions found",
    },
    {
      name: "пустой qid",
      path: "/",
      expectedError: "no quiz id",
    },
    {
      name: "некорректный qid",
      path: "/invalid-quiz-id-12345",
      expectedError: "invalid request data",
    },
    {
      name: "несуществующий qid",
      path: "/00000000-0000-0000-0000-000000000000",
      expectedError: "invalid request data",
    },
    {
      name: "qid с неправильным форматом",
      path: "/not-a-valid-uuid",
      expectedError: "invalid request data",
    },
  ];

  // Базовые тесты без проверки текста (для всех случаев)
  describe("Базовые проверки отображения apology page", () => {
    it("необходимо проверить, что apology page отображает свои ошибки", () => {
      cy.visit("/apology-page");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для неопубликованного квиза", () => {
      cy.visit("/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для опубликованного квиза без вопросов", () => {
      cy.visit("/228df092-1f9b-4c04-b08d-08726f0ef223");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для пустого qid", () => {
      cy.visit("/");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для некорректного qid", () => {
      cy.visit("/invalid-quiz-id-12345");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для несуществующего qid", () => {
      cy.visit("/00000000-0000-0000-0000-000000000000");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с неправильным форматом", () => {
      cy.visit("/not-a-valid-uuid");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с пустой строкой", () => {
      cy.visit("/ ");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с null значением", () => {
      cy.visit("/null");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с undefined значением", () => {
      cy.visit("/undefined");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с пустой строкой в URL", () => {
      cy.visit("/%20");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с специальными символами", () => {
      cy.visit("/!@#$%^&*()");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с очень длинной строкой", () => {
      cy.visit("/" + "a".repeat(1000));
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с SQL инъекцией", () => {
      cy.visit("/'; DROP TABLE quizzes; --");
      cy.get("#test-apology-page").should("be.visible");
    });

    it("должен показать apology page для qid с XSS попыткой", () => {
      cy.visit("/<script>alert('xss')</script>");
      cy.get("#test-apology-page").should("be.visible");
    });
  });

  // Параметризованные тесты с проверкой локализации
  localeConfigs.forEach(({ locale, urlPrefix, description }) => {
    describe(`Локализация: ${description}`, () => {
      testCases.forEach(({ name, path, expectedError }) => {
        it(`показывает правильную ошибку для "${name}" на ${description}`, () => {
          const fullUrl = `${urlPrefix}${path}`;

          cy.visit(fullUrl);
          cy.get("#test-apology-page").should("be.visible");

          // Проверяем что отображается правильный текст ошибки с использованием кешированных переводов
          cy.shouldHaveTranslation("#test-apology-page", expectedError, locale);
        });
      });

      // Специальные тесты для разных типов ошибок
      it(`показывает ошибку неактивного квиза на ${description}`, () => {
        cy.visit(`${urlPrefix}/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659`);
        cy.get("#test-apology-page").should("be.visible");
        cy.shouldHaveTranslation("#test-apology-page", "quiz is inactive", locale);
      });

      it(`показывает ошибку отсутствия вопросов на ${description}`, () => {
        cy.visit(`${urlPrefix}/228df092-1f9b-4c04-b08d-08726f0ef223`);
        cy.get("#test-apology-page").should("be.visible");
        cy.shouldHaveTranslation("#test-apology-page", "no questions found", locale);
      });

      it(`показывает ошибку отсутствия quiz id на ${description}`, () => {
        cy.visit(`${urlPrefix}/`);
        cy.get("#test-apology-page").should("be.visible");
        cy.shouldHaveTranslation("#test-apology-page", "no quiz id", locale);
      });

      it(`показывает ошибку невалидных данных на ${description}`, () => {
        cy.visit(`${urlPrefix}/invalid-quiz-id-12345`);
        cy.get("#test-apology-page").should("be.visible");
        cy.shouldHaveTranslation("#test-apology-page", "invalid request data", locale);
      });
    });
  });

  // Дополнительные тесты для проверки приоритета локалей
  describe("Приоритет выбора локали", () => {
    it("использует русскую локаль по умолчанию когда язык не указан", () => {
      cy.visit("/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659");
      cy.get("#test-apology-page").should("be.visible");
      cy.shouldHaveTranslation("#test-apology-page", "quiz is inactive", "ru");
    });

    it("использует явно указанную русскую локаль", () => {
      cy.visit("/ru/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659");
      cy.get("#test-apology-page").should("be.visible");
      cy.shouldHaveTranslation("#test-apology-page", "quiz is inactive", "ru");
    });

    it("использует английскую локаль когда указан /en", () => {
      cy.visit("/en/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659");
      cy.get("#test-apology-page").should("be.visible");
      cy.shouldHaveTranslation("#test-apology-page", "quiz is inactive", "en");
    });

    it("использует узбекскую локаль когда указан /uz", () => {
      cy.visit("/uz/b0d3c6d1-49b8-4cf8-bb4c-bde05eebb659");
      cy.get("#test-apology-page").should("be.visible");
      cy.shouldHaveTranslation("#test-apology-page", "quiz is inactive", "uz");
    });
  });

  // Тесты для проверки доступности файлов переводов
  describe("Доступность файлов переводов", () => {
    it("файл перевода ru.json доступен и содержит все ключи", () => {
      cy.loadTranslations("ru").then((translations) => {
        expect(translations).to.have.property("quiz is inactive");
        expect(translations).to.have.property("no_questions_found");
        expect(translations).to.have.property("quiz is empty");
        expect(translations).to.have.property("quiz already completed");
        expect(translations).to.have.property("no quiz id");
        expect(translations).to.have.property("quiz data is null");
        expect(translations).to.have.property("invalid request data");
      });
    });

    it("файл перевода en.json доступен и содержит все ключи", () => {
      cy.loadTranslations("en").then((translations) => {
        expect(translations).to.have.property("quiz_is_inactive");
        expect(translations).to.have.property("no_questions_found");
        expect(translations).to.have.property("quiz_is_empty");
        expect(translations).to.have.property("quiz_already_completed");
        expect(translations).to.have.property("no_quiz_id");
        expect(translations).to.have.property("quiz_data_is_null");
        expect(translations).to.have.property("invalid_request_data");
      });
    });

    it("файл перевода uz.json доступен и содержит все ключи", () => {
      cy.loadTranslations("uz").then((translations) => {
        expect(translations).to.have.property("quiz_is_inactive");
        expect(translations).to.have.property("no_questions_found");
        expect(translations).to.have.property("quiz_is_empty");
        expect(translations).to.have.property("quiz_already_completed");
        expect(translations).to.have.property("no_quiz_id");
        expect(translations).to.have.property("quiz_data_is_null");
        expect(translations).to.have.property("invalid_request_data");
      });
    });
  });
});
