/**
 * formData 로그 테스트 스크립트
 * - http://localhost:9771/screens/1599 접속
 * - P003 행 선택 → 추가 버튼 클릭 → 장비 선택 → 저장 전/후 콘솔 로그 수집
 *
 * 실행: npx tsx scripts/test-formdata-logs.ts
 * (Playwright 필요: npx playwright install chromium)
 */

import { chromium } from "playwright";

const TARGET_URL = "http://localhost:9771/screens/1599?menuObjid=1762422235300";
const LOGIN = { userId: "topseal_admin", password: "1234" };

const TARGET_LOGS = ["🔵", "🟡", "🔴", "process_code", "splitPanelParentData"];

async function main() {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();

  const consoleLogs: string[] = [];
  const errors: string[] = [];

  page.on("console", (msg) => {
    const text = msg.text();
    const type = msg.type();
    if (type === "error") {
      errors.push(`[CONSOLE ERROR] ${text}`);
    }
    const hasTarget = TARGET_LOGS.some((t) => text.includes(t));
    if (hasTarget || type === "error") {
      consoleLogs.push(`[${type}] ${text}`);
    }
  });

  console.log("1. 페이지 이동:", TARGET_URL);
  await page.goto(TARGET_URL, { waitUntil: "domcontentloaded", timeout: 20000 });

  // 로그인 필요 여부 확인
  const userIdInput = page.locator('input[name="userId"]').first();
  if (await userIdInput.isVisible().catch(() => false)) {
    console.log("2. 로그인 페이지 감지 - 로그인 진행");
    await page.fill('input[name="userId"]', LOGIN.userId);
    await page.fill('input[name="password"]', LOGIN.password);
    await page.click('button[type="submit"]').catch(() => page.click('button:has-text("로그인")'));
    await page.waitForTimeout(4000);
  }

  console.log("3. 5초 대기 (페이지 로드)");
  await page.waitForTimeout(5000);

  // 탭 확인 - 공정 마스터 (첫 번째 탭)
  const firstTab = page.getByRole("tab", { name: /공정 마스터/i }).or(page.locator('button:has-text("공정 마스터")')).first();
  if (await firstTab.isVisible().catch(() => false)) {
    console.log("4. '공정 마스터' 탭 클릭");
    await firstTab.click();
    await page.waitForTimeout(1500);
  }

  // 좌측 패널 테이블 데이터 로드 대기
  console.log("5. 좌측 패널 데이터 로드 대기");
  await page.locator("table tbody tr").first().waitFor({ state: "visible", timeout: 25000 }).catch(() => {
    throw new Error("좌측 테이블에 데이터가 없습니다. process_mng에 P003 등 데이터가 있는지 확인하세요.");
  });

  // P003 행 또는 첫 번째 행 클릭
  let rowToClick = page.locator('table tbody tr:has(td:has-text("P003"))').first();
  const hasP003 = await rowToClick.isVisible().catch(() => false);
  if (!hasP003) {
    console.log("   P003 미발견 - 첫 번째 행 클릭");
    rowToClick = page.locator("table tbody tr").first();
  }
  await rowToClick.click();
  await page.waitForTimeout(800);

  // 우측 패널에서 '추가' 버튼 클릭 (모달 열기)
  console.log("6. '추가' 버튼 클릭");
  const addBtn = page.locator('button:has-text("추가")').first();
  await addBtn.click();
  await page.waitForTimeout(2000);

  // 모달이 열렸는지 확인
  const modal = page.locator('[role="dialog"], [data-state="open"]').first();
  await modal.waitFor({ state: "visible", timeout: 5000 }).catch(() => {});

  // 모달 내 설비 드롭다운/콤보박스 선택 (v2-select, entity-search-input 등)
  console.log("7. 모달 내 설비 선택");
  const trigger = page.locator('[role="combobox"], button:has-text("선택"), button:has-text("설비")').first();
  if (await trigger.isVisible().catch(() => false)) {
    await trigger.click();
    await page.waitForTimeout(500);
    const option = page.locator('[role="option"], li[role="option"]').first();
    if (await option.isVisible().catch(() => false)) {
      await option.click();
    }
  } else {
    // select 태그인 경우
    const selectEl = page.locator('select').first();
    if (await selectEl.isVisible().catch(() => false)) {
      await selectEl.selectOption({ index: 1 });
    }
  }
  await page.waitForTimeout(800);

  // 저장 전 콘솔 스냅샷
  console.log("\n=== 저장 전 콘솔 로그 (formData 관련) ===");
  consoleLogs.forEach((l) => console.log(l));
  if (errors.length) {
    console.log("\n=== 에러 ===");
    errors.forEach((e) => console.log(e));
  }

  // 저장 버튼 클릭 (모달 내부의 저장 버튼)
  console.log("\n8. '저장' 버튼 클릭");
  const saveBtn = page.locator('[role="dialog"] button:has-text("저장"), [data-state="open"] button:has-text("저장")').first();
  await saveBtn.click();
  await page.waitForTimeout(3000);

  // 저장 후 로그 수집
  console.log("\n=== 저장 후 콘솔 로그 (formData 관련) ===");
  consoleLogs.forEach((l) => console.log(l));
  if (errors.length) {
    console.log("\n=== 에러 ===");
    errors.forEach((e) => console.log(e));
  }

  await page.waitForTimeout(2000);
  await browser.close();
}

main().catch((e) => {
  console.error("테스트 실패:", e);
  process.exit(1);
});
