// Проверка keep-alive: состояние вкладок не сбрасывается при переключении.
import { chromium } from "playwright";

const BASE = "http://localhost:5174/";
const results = [];
const pass = (n, d = "") => { results.push(["PASS", n, d]); console.log("PASS ::", n, d); };
const fail = (n, d = "") => { results.push(["FAIL", n, d]); console.log("FAIL ::", n, d); };

const b = await chromium.launch({ headless: true });
const ctx = await b.newContext({ viewport: { width: 1600, height: 900 } });
const p = await ctx.newPage();
const consoleErrors = [];
p.on("console", (m) => { if (m.type() === "error") consoleErrors.push(m.text()); });
p.on("pageerror", (e) => consoleErrors.push("PAGEERROR: " + e.message));

const tab = (name) => p.getByRole("tab", { name, exact: true });
// только видимая (активная) вкладка — карта присутствует и в Заявках (рисование полигона)
const mapToggle = (label) => p.locator(".tgu-map-toolbar__toggles button:visible", { hasText: label });
const isActive = async (loc) => ((await loc.getAttribute("class")) || "").includes("is-active");

try {
  await p.goto(BASE, { waitUntil: "networkidle", timeout: 30000 });
  await p.waitForTimeout(600);

  // --- Карта: меняем UI-состояние (выключаем слой «Станции») ---
  await tab("Карта").click();
  await p.waitForTimeout(500);
  const stationsToggle = mapToggle("Станции");
  (await isActive(stationsToggle)) ? pass("map:stations-on-initially") : fail("map:stations-on-initially");
  await stationsToggle.click();
  await p.waitForTimeout(150);
  (await isActive(stationsToggle)) === false
    ? pass("map:stations-toggled-off")
    : fail("map:stations-toggled-off");

  // --- Заявки: открываем форму создания (внутреннее состояние panelMode) ---
  await tab("Заявки").click();
  await p.waitForTimeout(400);
  await p.getByRole("button", { name: "+ Создать заявку", exact: true }).click();
  await p.waitForTimeout(250);
  (await p.locator(".tgu-requests-form").count()) > 0
    ? pass("requests:create-form-open")
    : fail("requests:create-form-open");

  // --- уходим на Планы и возвращаемся ---
  await tab("Планы").click();
  await p.waitForTimeout(300);

  // Карта: слой «Станции» по-прежнему выключен?
  await tab("Карта").click();
  await p.waitForTimeout(400);
  (await isActive(mapToggle("Станции"))) === false
    ? pass("map:state-preserved", "слой «Станции» остался выключен")
    : fail("map:state-preserved", "состояние слоёв сбросилось");

  // Заявки: форма создания всё ещё открыта?
  await tab("Заявки").click();
  await p.waitForTimeout(400);
  (await p.locator(".tgu-requests-form").count()) > 0
    ? pass("requests:state-preserved", "форма создания осталась открытой")
    : fail("requests:state-preserved", "форма закрылась (состояние сброшено)");

  // Скрытые вкладки не должны размонтироваться: в DOM присутствуют сразу несколько <main>
  await tab("Планы").click();
  await p.waitForTimeout(200);
  const mains = await p.locator(".tgu-app-shell main").count();
  mains >= 3
    ? pass("keep-alive:tabs-mounted", `<main> в DOM: ${mains}`)
    : fail("keep-alive:tabs-mounted", `ожидалось >=3, найдено ${mains}`);

} catch (e) {
  fail("EXCEPTION", e.message);
} finally {
  if (consoleErrors.length) console.log("CONSOLE_ERRORS", JSON.stringify(consoleErrors, null, 2));
  const failed = results.filter((r) => r[0] === "FAIL").length;
  console.log(`\n=== ${results.length - failed}/${results.length} PASS, ${failed} FAIL ===`);
  await b.close();
  process.exit(failed ? 1 : 0);
}
