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

/**
 * ============================================================================
 * UC22 — 1.4.1 Tạo thư mục trong Cấu trúc hồ sơ
 * Case 154 (QA): Kiểm tra hiển thị button Thêm thư mục
 *                — vai CHỈ có quyền tại 1 thư mục trong cấu trúc
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE ─────────────────────────────────────────────────────
 * Tiền điều kiện:
 *   - Người dùng **chỉ có quyền Owner / Tạo mới ở cấu trúc thư mục** (không phải ở BHS)
 *   - Thư mục đã tồn tại
 * 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 Thêm thư mục trong menu mở rộng của dòng
 * Mong muốn:
 *   **Chỉ** hiển thị button Thêm thư mục ở menu mở rộng tại **dòng mà người dùng có quyền**.
 *
 * Tiền điều kiện chung của mục 1.4.1: xem `1.4.1.md`.
 *
 * ── CÁCH DỰNG TIỀN ĐIỀU KIỆN (xem `1.4.1.setup.ts`) ─────────────────────────
 *     BHS  (Owner = Thủ thư; cấp thêm **Quyền Xem** cho vai cần test — xem ghi chú ⚠️ dưới)
 *      ├─ ...-TM      ← thư mục KẾ THỪA quyền BHS → vai cần test **KHÔNG** có quyền tạo mới ở đây
 *      └─ ...-TM-CQ   ← thư mục **quyền độc lập**, cấp Owner / Tạo mới cho vai cần test
 *     → BHS chuyển "Hoạt động" (vai không phải người tạo BHS chỉ mở được BHS ở trạng thái này).
 *
 * ⚠️ **Giả định của script**: QA chỉ nói vai có quyền Owner/Tạo mới tại thư mục, không nói vai
 *    có quyền gì ở BHS. Script cấp thêm **Quyền Xem ở BHS** cho vai đó, vì nếu vai chỉ có quyền
 *    tại đúng 1 thư mục thì bảng Cấu trúc hồ sơ **chỉ hiện đúng nhánh đó**
 *    (`KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md` mục 3) → sẽ không còn dòng "không có quyền" nào để
 *    kiểm chứng chữ **"chỉ"** trong mong muốn của QA. Nếu QA muốn hiểu theo nghĩa "vai không thấy
 *    dòng nào khác" thì đổi cách dựng: bỏ quyền Xem ở BHS và assert bảng chỉ có 1 dòng.
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B1. Vai cần test mở BHS → tab "Cấu trúc hồ sơ".
 * B2a. Dòng `...-TM-CQ` (**có** quyền): menu mở rộng **có** mục `mni-them-thu-muc`.
 * B2b. Dòng `...-TM` (**không** có quyền): menu mở rộng **không** có mục `mni-them-thu-muc`
 *      (không có nút mở menu cũng thoả — xem `1.4.1.steps.ts`).
 *
 * ── 3 TEST = 3 BỘ HỒ SƠ RIÊNG ───────────────────────────────────────────────
 * | # | Vai thao tác     | Quyền tại thư mục `...-TM-CQ`     | Quyền ở BHS |
 * |---|------------------|-----------------------------------|-------------|
 * | 1 | ecm06            | **Tạo mới** (`FOLDER_PICKER.ADD`) | Xem         |
 * | 2 | ecm05            | **Owner** (`FOLDER_PICKER.OWNER`) | Xem         |
 * | 3 | ecm06 (qua nhóm) | Owner cấp cho `AUTO_GROUP_ECM06`  | Xem         |
 */

const runTest = async (
  librarian: Page,
  userPage: Page,
  maCase: string,
  vai: { account: string; permTestId: string },
) => {
  const duLieu = await dungDuLieuBoHoSo(librarian, {
    maCase: `154-${maCase}`,
    // Quyền Xem ở BHS: chỉ để vai thấy được cả 2 dòng thư mục (xem ghi chú ⚠️ đầu file)
    quyenBanDau: { permTestId: DOC_PERM.VIEW, account: vai.account },
    taoThuMucCoQuyen: { account: vai.account, permTestId: vai.permTestId },
    chuyenSangHoatDong: true,
  });

  await moTabCauTrucHoSo(userPage, duLieu);
  await expectCoNutThemThuMucODong(userPage, duLieu.tenThuMucCoQuyen);
  await expectKhongCoNutThemThuMucODong(userPage, duLieu.tenThuMuc);
};

/** TEST 1 — `ecm06` có **Quyền Tạo mới** tại thư mục `...-TM-CQ`. */
test(
  "UC22 154 - Kiểm tra hiển thị button Thêm thư mục - Người dùng có quyền Tạo mới tại thư mụcecm06",
  async ({ librarian, ecm06 }) => {
    await runTest(librarian, ecm06, "ADD", {
      account: "ecm06",
      permTestId: FOLDER_PICKER.ADD,
    });
  },
);

/** TEST 2 — `ecm05` có **Quyền Owner** tại thư mục `...-TM-CQ`. */
test(
  "UC22 154 - Kiểm tra hiển thị button Thêm thư mục - Người dùng có quyền Owner tại thư mụcecm05",
  async ({ librarian, ecm05 }) => {
    await runTest(librarian, ecm05, "OWN", {
      account: "ecm05",
      permTestId: FOLDER_PICKER.OWNER,
    });
  },
);

/** TEST 3 — **NHÓM** `AUTO_GROUP_ECM06` có quyền Owner tại thư mục; thao tác bằng `ecm06`. */
test(
  "UC22 154 - Kiểm tra hiển thị button Thêm thư mục - Nhóm có quyền Owner tại thư mụcecm06",
  async ({ librarian, ecm06 }) => {
    await runTest(librarian, ecm06, "GRP", {
      account: GROUP.ECM06,
      permTestId: FOLDER_PICKER.OWNER,
    });
  },
);
