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!;

const assertRelatedModalHeaders = async (targetPage: Page) => {
  const modalContent = targetPage.locator(".ant-modal-content:visible").last();
  await targetPage.waitForTimeout(TIMEOUT.DATA_LOADING);
  const rows = modalContent.locator(".ant-table-row.ant-table-row-level-0");
  const rowCount = await rows.count();
  expect(rowCount).toBe(10);

  const prevPageItem = modalContent.locator('li[title="Previous Page"]');
  const nextPageItem = modalContent.locator('li[title="Next Page"]');
  const pageOneItem = modalContent.locator(".ant-pagination-item-1");
  const searchInput = modalContent.locator(
    'input[placeholder="Nhập tên hồ sơ, số hồ sơ"]',
  );

  await expect(prevPageItem, {
    message: "Lỗi: Nút prev phải ở trạng thái disable khi vừa mở modal",
  }).toHaveClass(/ant-pagination-disabled/);

  await expect(prevPageItem.locator("button"), {
    message: "Lỗi: Button prev phải bị disabled khi vừa mở modal",
  }).toBeDisabled();

  await expect(pageOneItem, {
    message: "Lỗi: Trang mặc định ban đầu phải là trang 1",
  }).toHaveClass(/ant-pagination-item-active/);

  await nextPageItem.click();
  await expect(modalContent.locator(".ant-pagination-item-2"), {
    message: "Lỗi: Sau khi bấm next phải active trang 2",
  }).toHaveClass(/ant-pagination-item-active/);

  await prevPageItem.click();
  await expect(pageOneItem, {
    message: "Lỗi: Sau khi bấm prev phải quay lại active trang 1",
  }).toHaveClass(/ant-pagination-item-active/);

  await searchInput.fill("HS");
  await targetPage.waitForTimeout(10000);

  await nextPageItem.click();
  await expect(modalContent.locator(".ant-pagination-item-2"), {
    message: "Lỗi: Sau khi nhập HS và bấm next phải active trang 2",
  }).toHaveClass(/ant-pagination-item-active/);
  await expect(searchInput, {
    message: "Lỗi: Text trong ô tìm kiếm bị mất sau khi bấm next",
  }).toHaveValue("HS");

  await prevPageItem.click();
  await expect(pageOneItem, {
    message: "Lỗi: Sau khi nhập HS và bấm prev phải active lại trang 1",
  }).toHaveClass(/ant-pagination-item-active/);
  await expect(searchInput, {
    message: "Lỗi: Text trong ô tìm kiếm bị mất sau khi bấm prev",
  }).toHaveValue("HS");
};

const runTest = async (page: Page, ecm05: Page) => {
  const pw = new PW(page);

  await test.step("1. Truy cập màn hình Kho tài liệu", async () => {
    await page.goto(`${BASE_URL}${uc29DefaultUrl}`);
  });
  await test.step("2. Chọn nút Tạo mới", async () => {
    await pw.isVisible("btn-create-hstl", TIMEOUT.PAGE_LOADING);
    await pw.wait(TIMEOUT.HARD_WAITING);
    await pw.clickButton("btn-create-hstl");
  });
  await test.step("3. Kiểm tra nút bấm thêm Thông tin liên quan ở màn Tạo mới hồ sơ", async () => {
    await pw.clickButton("btn-add-related-ecm");
    await page
      .getByText("Tìm hồ sơ liên quan")
      .waitFor({ timeout: TIMEOUT.ACTION_LOADING });
    await assertRelatedModalHeaders(page);
    await page.getByRole("button", { name: "Hủy" }).click();
  });
  await test.step("4. Tạo mới bộ hồ sơ", async () => {
    await pw.batchInput(
      uc29DefaultData.filter((o) => o.testId !== "pp-multi-usersRightOwner"),
      true,
    );
    await pw.inputPeoplePicker("pp-multi-usersRightOwner", "ecm05");
    await pw.clickButton("btn-save");
    await expect(page.locator(".ant-message-success"), {
      message: 'Lỗi: Thông báo không phải "Tạo mới thành công"',
    }).toBeVisible({ timeout: TIMEOUT.ACTION_LOADING });
  });
  await test.step("5. Kiểm tra nút bấm thêm Thông tin liên quan ở màn Cập nhật hồ sơ", async () => {
    await pw.clickButton("btn-add-related-ecm");
    await page
      .getByText("Tìm hồ sơ liên quan")
      .waitFor({ timeout: TIMEOUT.ACTION_LOADING });
    await assertRelatedModalHeaders(page);
    await page.getByRole("button", { name: "Hủy" }).click();
  });
  const currentUrl = page.url();
  const pwEcm05 = new PW(ecm05);
  await test.step("6. Kiểm tra bằng tài khoản Owner", async () => {
    await ecm05.goto(currentUrl);
    await pwEcm05.wait(TIMEOUT.HARD_WAITING);
  });

  await test.step("7. Kiểm tra nút bấm thêm Thông tin liên quan ở quyền Owner", async () => {
    await pwEcm05.clickButton("lbl-tab-thongTin");
    await pwEcm05.clickButton("btn-add-related-ecm");
    await ecm05
      .getByText("Tìm hồ sơ liên quan")
      .waitFor({ timeout: TIMEOUT.ACTION_LOADING });
    await assertRelatedModalHeaders(ecm05);
    await ecm05.getByRole("button", { name: "Hủy" }).click();
  });
  //   await test.step("6. Kiểm tra nút bấm thêm Thông tin liên quan ở")
};

test(
  "UC29 1.1.2.1.59 - Phân trang danh sách hồ sơ theo CBR (mặc định 10 items/trang) - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian, ecm05 }) => {
    await runTest(librarian, ecm05);
  },
);
test(
  "UC29 1.1.2.1.59 - Phân trang danh sách hồ sơ theo CBR (mặc định 10 items/trang) - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm05 }) => {
    await runTest(admin, ecm05);
  },
);
