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 { uc77DefaultData, uc77DefaultUrl } from "../uc77.default.data";

const BASE_URL = process.env.BASE_URL!;

const addFolderCauTrucHoSo = async (userPage: Page, pwUser: PW) => {
  await userPage.getByTestId("lbl-tab-cauTrucHoSo").click();
  await userPage
    .locator(".ant-modal-content")
    .last()
    .locator("button span")
    .filter({ hasText: /^Tạo mới$/ })
    .click();

  const folderModal = userPage.locator(".ant-modal-content").last();
  await folderModal
    .locator('input[type="text"][placeholder="Nhập tên"]')
    .fill("Thư mục A");

  if (await folderModal.getByTestId("tree-sel-submissionUnit").isVisible()) {
    await pwUser.inputTreeDropDown("tree-sel-submissionUnit");
  }

  const uniqueCheckbox = folderModal.locator('input#uniquePermission[type="checkbox"]');
  if (await uniqueCheckbox.isVisible()) {
    await uniqueCheckbox.check();
  } else {
    await folderModal
      .locator(".ant-tabs-nav-list .ant-tabs-tab")
      .filter({ hasText: "Phân quyền" })
      .click();
    await folderModal
      .locator(".ant-alert-action")
      .getByRole("button", { name: "Đặt quyền độc lập" })
      .click();
  }

  const peoplePicker = folderModal.locator(".people-picker").first();
  await peoplePicker.click();
  await peoplePicker.locator("input").fill("ecm05");
  await userPage.waitForTimeout(5000);
  await peoplePicker.locator("input").press("Enter");

  await folderModal.getByRole("button", { name: /Lưu/ }).click();
  await expect(userPage.locator(".ant-message-notice"), {
    message: "Lỗi: Thông báo 'Thành công' sau Tạo thư mục không hiển thị",
  }).toContainText("Thành công", { timeout: TIMEOUT.ACTION_LOADING });
};

const addDocumentCauTrucHoSo = async (userPage: Page, pwUser: PW) => {
  await userPage.getByTestId("lbl-tab-cauTrucHoSo").click();

  const cauTrucModal = userPage.locator(".ant-modal-content").last();
  await cauTrucModal.locator(".ant-dropdown-trigger").hover();
  await userPage
    .locator("li.ant-dropdown-menu-item")
    .filter({ hasText: "Tài liệu" })
    .click();

  await userPage.waitForTimeout(10000);

  const docModal = userPage.locator(".ant-modal-content").last();
  await docModal.locator('[data-testid="txt-ten-tai-lieu"]').fill("Tài liệu B");
  await pwUser.inputDropDownList("sel-loai-tai-lieu");
  await docModal.locator("input#basic_hasUniquePermission").check();
  await pwUser.inputPeoplePicker("pp-multi-usersRightOwner", "ecm06");
  await pwUser.clickButton("btn-save");

  await expect(userPage.locator(".ant-message-notice"), {
    message: "Lỗi: Thông báo 'Thành công' sau Tạo tài liệu không hiển thị",
  }).toContainText("Thành công", { timeout: TIMEOUT.ACTION_LOADING });
};

test(
  "UC77,78,80 1.2.88 - Owner thư mục/tài liệu chỉ thấy 'Theo phân quyền' - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm05, ecm06 }) => {
    const pw = new PW(admin);
    const uniqueName = `AT-UC77-88-${Date.now()}`;

    await test.step("1. Admin tạo mới hồ sơ (không gán Owner cấp hồ sơ)", async () => {
      await admin.goto(`${BASE_URL}${uc77DefaultUrl}`);
      await pw.isVisible("btn-create-hstl", TIMEOUT.PAGE_LOADING);
      await pw.wait(TIMEOUT.HARD_WAITING);
      await pw.clickButton("btn-create-hstl");
      await pw.batchInput(
        uc77DefaultData.filter(
          (o) =>
            !o.testId.startsWith("pp-multi-") &&
            o.testId !== "txt-tenHoSo" &&
            o.testId !== "btn-add-related-ecm",
        ),
        true,
      );
      await pw.inputText("txt-tenHoSo", uniqueName);
      await pw.clickButton("btn-save");
      await expect(admin.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);
    });

    const recordUrl = admin.url();

    await test.step("2. Admin tạo Thư mục với Owner là ecm05", async () => {
      await addFolderCauTrucHoSo(admin, pw);
    });

    await test.step("3. Admin tạo Tài liệu với Owner là ecm06", async () => {
      await addDocumentCauTrucHoSo(admin, pw);
    });

    await test.step("4. Admin chuyển hồ sơ sang trạng thái Hoạt động", async () => {
      await admin.getByRole("button", { name: "Chuyển Hoạt động" }).click();
      await admin
        .locator(".ant-modal-confirm-btns")
        .getByRole("button", { name: "Chuyển hoạt động" })
        .click();
      await expect(admin.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 });
      await pw.wait(TIMEOUT.ACTION_LOADING);
    });

    const ROLE_CHECKS = [
      { userPage: ecm05, label: "ecm05 Owner Thư mục" },
      { userPage: ecm06, label: "ecm06 Owner Tài liệu" },
    ];

    await test.step("5–6. ecm05 và ecm06 chỉ thấy 'Theo phân quyền', không thấy 'Theo người dùng'", async () => {
      for (const { userPage, label } of ROLE_CHECKS) {
        await test.step(`Kiểm tra [${label}]`, async () => {
          const pwUser = new PW(userPage);
          await userPage.goto(recordUrl);
          await pwUser.wait(TIMEOUT.HARD_WAITING);

          const trigger = userPage.getByTestId("btn-more");
          await expect(trigger, {
            message: `[${label}] Lỗi: Không tìm thấy nút btn-more trên title modal`,
          }).toBeVisible({ timeout: TIMEOUT.CONTROL_LOADING });
          await trigger.hover();
          await expect(userPage.getByTestId("btn-kiem-tra-phan-quyen"), {
            message: `[${label}] Lỗi: Không hiển thị button 'Kiểm tra phân quyền'`,
          }).toBeVisible({ timeout: TIMEOUT.CONTROL_LOADING });

          await userPage.getByTestId("btn-kiem-tra-phan-quyen").click();
          await userPage.waitForTimeout(TIMEOUT.DATA_LOADING);

          await expect(userPage.getByText("Theo phân quyền"), {
            message: `[${label}] Lỗi: Không hiển thị tuỳ chọn 'Theo phân quyền'`,
          }).toBeVisible({ timeout: TIMEOUT.CONTROL_LOADING });
          await expect(userPage.getByText("Theo người dùng"), {
            message: `[${label}] Lỗi: Vẫn hiển thị 'Theo người dùng' — chỉ Owner cấp hồ sơ mới được thấy`,
          }).not.toBeVisible({ timeout: TIMEOUT.CONTROL_LOADING });
        });
      }
    });
  },
);
