import { Page } from "@playwright/test";
import { test, expect, ACCOUNT } from "../../../src/fixture/base-test";
import { TIMEOUT } from "../../../src/constant/timeout";
import { PW } from "../../../src/utils/PW";
import { uc29DefaultData, uc29DefaultUrl } from "../uc29.default.data";

const BASE_URL = process.env.BASE_URL!;

// 5 vai quyền ecm05 sẽ được gán lần lượt qua từng vòng
const PP_FIELDS = [
  "pp-multi-usersRightOwner",
  "pp-multi-usersRightAdd",
  "pp-multi-usersRightEdit",
  "pp-multi-usersRightDownload",
  "pp-multi-usersRightViewers",
] as const;

// base: bỏ tất cả pp-multi-* (xử lý riêng) và btn-add-related-ecm (thêm liên quan thủ công)
const baseData = uc29DefaultData.filter(
  (o) =>
    !o.testId.startsWith("pp-multi-") && o.testId !== "btn-add-related-ecm",
);

// "Chuyển Hoạt động" → confirm modal → assert "Thành công"
const chuyenHoatDong = async (page: Page) => {
  await page.getByTestId("btn-chuyen-hoat-dong").click();
  await page
    .locator(".ant-modal-confirm-btns")
    .getByRole("button", { name: "Chuyển hoạt động" })
    .click();
  await expect(page.locator(".ant-message-notice"), {
    message: "Lỗi: Thông báo 'Thành công' sau Chuyển Hoạt động không hiển thị",
  }).toContainText("Thành công", { timeout: TIMEOUT.ACTION_LOADING });
};

// Tìm hồ sơ theo tên trong pop-up "Tìm hồ sơ liên quan", chọn và bấm Thêm
const addRelatedHoSoByName = async (page: Page, pw: PW, targetName: string) => {
  await pw.clickButton("btn-add-related-ecm");
  await page
    .getByText("Tìm hồ sơ liên quan")
    .waitFor({ timeout: TIMEOUT.ACTION_LOADING });

  const modalContent = page.locator(".ant-modal-content:visible").last();
  const searchInput = modalContent.locator(
    'input[placeholder="Nhập tên hồ sơ, số hồ sơ"]',
  );
  await searchInput.fill(targetName);
  await searchInput.press("Enter");
  await page.waitForTimeout(10000);

  const firstRow = modalContent
    .locator(".ant-table-row.ant-table-row-level-0")
    .first();
  await expect(firstRow, {
    message: `Lỗi: Không tìm thấy hồ sơ "${targetName}" trong kết quả tìm kiếm`,
  }).toContainText(targetName, { timeout: TIMEOUT.DATA_LOADING });
  await firstRow.hover();
  await modalContent
    .locator(".ant-table-row.ant-table-row-level-0 .ant-checkbox-wrapper")
    .first()
    .click();
  await expect(page.getByTestId("btn-add-related"), {
    message: "Lỗi: Nút 'Thêm' không hiển thị khi đã chọn hồ sơ",
  }).toBeVisible({ timeout: TIMEOUT.CONTROL_LOADING });
  await pw.clickButton("btn-add-related");
  await pw.isVisible("related-item-table");
};

const runTest = async (page: Page, ecm05Page: Page) => {
  const pw = new PW(page);
  const pwEcm05 = new PW(ecm05Page);
  const preRecordName = `AT-HSTL-83-PRE-${Date.now()}`;

  // Tạo sẵn 1 hồ sơ với Owner = ecm05 để các phiếu chính đều link tới đúng hồ sơ
  // ecm05 có quyền, đảm bảo bước mở tab mới không bị chặn
  await test.step("0. Tạo trước hồ sơ phân quyền Owner cho ecm05", async () => {
    await page.goto(`${BASE_URL}${uc29DefaultUrl}`);
    await pw.isVisible("btn-create-hstl", TIMEOUT.PAGE_LOADING);
    await pw.wait(TIMEOUT.HARD_WAITING);
    await pw.clickButton("btn-create-hstl");

    await pw.batchInput(
      baseData.filter((o) => o.testId !== "txt-tenHoSo"),
      true,
    );
    await pw.inputText("txt-tenHoSo", preRecordName);
    await pw.inputPeoplePicker("pp-multi-usersRightOwner", "ecm05");
    await pw.clickButton("btn-save");
    await expect(page.locator(".ant-message-success"), {
      message: "Lỗi: Tạo hồ sơ chuẩn bị không thành công",
    }).toBeVisible({ timeout: TIMEOUT.ACTION_LOADING });
    await pw.wait(TIMEOUT.ACTION_LOADING);

    await chuyenHoatDong(page);
    await pw.wait(TIMEOUT.ACTION_LOADING);

    await pw.clickButton("btn-close-modal");
    await expect(page.getByTestId("btn-close-modal")).not.toBeVisible({
      timeout: TIMEOUT.ACTION_LOADING,
    });
  });

  for (const ppField of PP_FIELDS) {
    const label = ppField.replace("pp-multi-", "");
    const uniqueName = `AT-HSTL-83-${label}-${Date.now()}`;

    await test.step(`[${label}] 1. Tạo phiếu mới, thêm hồ sơ đã chuẩn bị làm hồ sơ liên quan`, async () => {
      await page.goto(`${BASE_URL}${uc29DefaultUrl}`);
      await pw.isVisible("btn-create-hstl", TIMEOUT.PAGE_LOADING);
      await pw.wait(TIMEOUT.HARD_WAITING);
      await pw.clickButton("btn-create-hstl");

      await pw.batchInput(
        baseData.filter((o) => o.testId !== "txt-tenHoSo"),
        true,
      );
      await pw.inputText("txt-tenHoSo", uniqueName);

      // Tìm theo tên hồ sơ đã tạo trước để đảm bảo ecm05 có quyền Owner trên hồ sơ đó
      await addRelatedHoSoByName(page, pw, preRecordName);
      await expect(
        page.getByTestId("related-item-table").locator(".cssMaHSTLChild"),
        { message: "Lỗi: Chưa thêm được hồ sơ liên quan" },
      ).toHaveCount(1);
    });

    await test.step(`[${label}] 2. Thêm tài liệu liên quan — chờ data-testid bổ sung`, async () => {
      // TODO: cập nhật khi data-testid tài liệu liên quan sẵn sàng
      console.log(
        `[${label}] TODO: thêm tài liệu liên quan — chờ data-testid từ dev`,
      );
    });

    await test.step(`[${label}] 3. Thêm ecm05 vào ${ppField}`, async () => {
      await pw.inputPeoplePicker(ppField, "ecm05");
    });

    await test.step(`[${label}] 4. Lưu và Chuyển Hoạt động`, async () => {
      await pw.clickButton("btn-save");
      await expect(page.locator(".ant-message-success"), {
        message: "Lỗi: Tạo mới hồ sơ không thành công",
      }).toBeVisible({ timeout: TIMEOUT.ACTION_LOADING });
      await pw.wait(TIMEOUT.ACTION_LOADING);

      await chuyenHoatDong(page);
    });

    await test.step(`[${label}] 5. Lấy URL phiếu và mở bằng ecm05`, async () => {
      await pw.wait(TIMEOUT.ACTION_LOADING);
      const recordUrl = page.url();
      await ecm05Page.goto(recordUrl);
      await pwEcm05.wait(TIMEOUT.HARD_WAITING);
      await pwEcm05.clickButton("lbl-tab-thongTin");
      await pwEcm05.isVisible("related-item-table", TIMEOUT.DATA_LOADING);
    });

    await test.step(`[${label}] 6. ecm05 mở hồ sơ liên quan trong tab mới và kiểm tra tên`, async () => {
      const rows = ecm05Page
        .getByTestId("related-item-table")
        .locator("tr.ant-table-row.ant-table-row-level-1");

      await expect(rows, {
        message: "Lỗi: Số dòng hồ sơ liên quan hiển thị không phải 1",
      }).toHaveCount(1, { timeout: TIMEOUT.DATA_LOADING });

      const row = rows.first();
      // td thứ 3 (index 2): tên HS/TL
      const name = (
        (await row.locator("td").nth(2).textContent()) || ""
      ).trim();
      expect(name, {
        message: "Lỗi: Tên hồ sơ liên quan đang trống",
      }).not.toBe("");

      // td thứ 2 (index 1): nút mở tab mới
      const [newTab] = await Promise.all([
        ecm05Page.context().waitForEvent("page"),
        row.locator("td").nth(1).locator("button").click(),
      ]);
      await newTab.waitForLoadState("domcontentloaded");
      await expect(newTab.getByTestId("lbl-tenHoSo"), {
        message: `Lỗi: lbl-tenHoSo trong tab mới không chứa tên "${name}"`,
      }).toContainText(name, { timeout: TIMEOUT.PAGE_LOADING });
      await newTab.close();
    });
  }
};

test(
  "UC29 1.1.2.9.83 - Kiểm tra khi truy cập HS/TL trong mục Thông tin liên quan - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian, ecm05 }) => {
    await runTest(librarian, ecm05);
  },
);
test(
  "UC29 1.1.2.9.83 - Kiểm tra khi truy cập HS/TL trong mục Thông tin liên quan - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm05 }) => {
    await runTest(admin, ecm05);
  },
);
