import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import { DOC_PERM } from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuBoHoSo, DuLieu } from "./1.4.1.setup";
import {
  moTabCauTrucHoSo,
  expectCoNutTaoMoiVoi2MucCon,
  expectCoNutThemThuMucODong,
} from "./1.4.1.steps";

/**
 * ============================================================================
 * UC22 — 1.4.1 Tạo thư mục trong Cấu trúc hồ sơ
 * Case 153 (QA): Kiểm tra hiển thị button Thêm thư mục
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE ─────────────────────────────────────────────────────
 * Tiền điều kiện (chung của mục 1.4.1):
 *   - Thủ thư / ITAdmin / Người dùng được phân quyền tạo mới hồ sơ: BHS ở trạng thái
 *     "Khai báo" hoặc "Đang hoạt động".
 *   - Người dùng / Nhóm được phân quyền **Owner** của Bộ hồ sơ: BHS "Đang hoạt động".
 *   - Người dùng / Nhóm được phân quyền **Tạo mới** trong Cấu trúc hồ sơ: BHS "Đang hoạt động".
 *   - Người dùng / Nhóm được phân quyền **Tạo mới tại Thư mục** trong BHS: BHS "Đang hoạt động".
 * Tiền điều kiện của case 153:
 *   - Người dùng là Thủ thư / ITAdmin / Owner / có Quyền Tạo mới ở BHS.
 * Thao tác:
 *   1. Truy cập màn chi tiết BHS, chọn tab Cấu trúc hồ sơ
 *   2. Kiểm tra hiển thị nút Tạo mới
 * Mong muốn:
 *   - Trên top menu, hiển thị nút Thêm mới với 2 button con: **Thư mục**, **Tài liệu**
 *   - Tại menu mở rộng trên các dòng thư mục trong cấu trúc thư mục, hiển thị button
 *     **Thêm thư mục**
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B0. Tiền điều kiện (xem `1.4.1.setup.ts`): tạo BHS + 1 thư mục ở gốc BHS (thư mục này để
 *     có dòng thư mục mà kiểm tra "menu mở rộng trên các dòng thư mục").
 * B1. Mở lại BHS → tab "Cấu trúc hồ sơ".
 * B2a. Assert nút "Tạo mới" (`btn-tao-moi`) hiển thị trên toolbar của tab.
 * B2b. Hover mũi tên cạnh nút "Tạo mới" → assert dropdown có 2 mục `mni-them-thu-muc`
 *      ("Thư mục") và `mni-them-tai-lieu` ("Tài liệu").
 * B2c. Hover dòng thư mục → mở menu mở rộng của dòng (`btn-more-action-<id>`) →
 *      assert có mục `mni-them-thu-muc` ("Thêm Thư mục").
 *      (B1–B2c dùng các bước chung trong `1.4.1.steps.ts` — case 154/155/156 dùng lại.)
 *
 * ⚠️ Khác biệt so với mô tả QA: dropdown nút "Tạo mới" thực tế có **3 mục** —
 *    "Thư mục", "Tài liệu" và "Tạo hồ sơ liên quan" (đã khảo sát, xem KHO-TAI-LIEU.md mục 4.4).
 *    Case này chỉ assert **có đủ 2 mục QA yêu cầu**, không assert "đúng 2 mục" để không fail vì
 *    mục thứ 3 đang tồn tại theo thiết kế hiện tại. Nếu QA muốn chốt đúng 2 mục thì sửa assert.
 *
 * ── 4 TEST = 4 BỘ HỒ SƠ RIÊNG (mỗi test tự dựng dữ liệu của nó) ──────────────
 * | # | Vai thao tác     | Ai dựng dữ liệu | Quyền của vai tại BHS         | Trạng thái BHS |
 * |---|------------------|-----------------|-------------------------------|----------------|
 * | 1 | Thủ thư (ecm01)  | chính nó        | Owner (vì tự tạo BHS)         | Khai báo       |
 * | 2 | ITAdmin (ecm09)  | chính nó        | Owner (vì tự tạo BHS)         | Khai báo       |
 * | 3 | ecm06            | Thủ thư         | Owner — cấp ở BHS             | Hoạt động      |
 * | 4 | ecm05            | Thủ thư         | Tạo mới (ADD) — cấp ở BHS     | Hoạt động      |
 *
 * ⚠️ Test 3–4: vai không phải người tạo BHS chỉ mở được BHS khi BHS ở trạng thái "Hoạt động"
 *    (KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md mục 1) → setup gọi `chuyenHoatDong`.
 */

/** Mong muốn của case: nút "Tạo mới" + 2 mục con, và menu dòng thư mục có "Thêm thư mục" */
const kiemTraHienThiNutThemThuMuc = async (userPage: Page, duLieu: DuLieu) => {
  await moTabCauTrucHoSo(userPage, duLieu);
  await expectCoNutTaoMoiVoi2MucCon(userPage);
  await expectCoNutThemThuMucODong(userPage, duLieu.tenThuMuc);
};

/* -------------------------------------------------------------------------- */
/* Vai tự tạo BHS (Thủ thư / ITAdmin) — vừa dựng dữ liệu vừa kiểm tra          */
/* -------------------------------------------------------------------------- */

const runTestOwnerBoHoSo = async (page: Page, maCase: string) => {
  const duLieu = await dungDuLieuBoHoSo(page, { maCase: `153-${maCase}` });
  await kiemTraHienThiNutThemThuMuc(page, duLieu);
};

/** TEST 1 — Thủ thư (ecm01), BHS `AT-UC22-153-TT-<ts>` trạng thái Khai báo. */
test(
  "UC22 153 - Kiểm tra hiển thị button Thêm thư mục - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTestOwnerBoHoSo(librarian, "TT");
  },
);

/** TEST 2 — ITAdmin (ecm09). Dữ liệu & thao tác y hệt TEST 1. */
test(
  "UC22 153 - Kiểm tra hiển thị button Thêm thư mục - Admin" + ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTestOwnerBoHoSo(admin, "AD");
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền ở BHS (không phải người tạo BHS)                        */
/* Thủ thư dựng dữ liệu + chuyển BHS sang Hoạt động, vai kia mở BHS kiểm tra   */
/* -------------------------------------------------------------------------- */

const runTestVaiDuocPhanQuyen = async (
  librarian: Page,
  userPage: Page,
  maCase: string,
  vai: { account: string; permTestId: string },
) => {
  const duLieu = await dungDuLieuBoHoSo(librarian, {
    maCase: `153-${maCase}`,
    quyenBanDau: { permTestId: vai.permTestId, account: vai.account },
    chuyenSangHoatDong: true,
  });

  await kiemTraHienThiNutThemThuMuc(userPage, duLieu);
};

/** TEST 3 — `ecm06` được phân quyền **Owner** của BHS. */
test(
  "UC22 153 - Kiểm tra hiển thị button Thêm thư mục - Người dùng có quyền Owner ở BHSecm06",
  async ({ librarian, ecm06 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm06, "OWN", {
      account: "ecm06",
      permTestId: DOC_PERM.OWNER,
    });
  },
);

/** TEST 4 — `ecm05` được phân quyền **Tạo mới** ở BHS. */
test(
  "UC22 153 - Kiểm tra hiển thị button Thêm thư mục - Người dùng có quyền Tạo mới ở BHSecm05",
  async ({ librarian, ecm05 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm05, "ADD", {
      account: "ecm05",
      permTestId: DOC_PERM.ADD,
    });
  },
);
