import { Page } from "@playwright/test";
import { test, ACCOUNT, GROUP } from "../../src/fixture/base-test";
import {
  openChiTietTaiLieu,
  openCapNhatQuyenTaiLieu,
  getThuMucModal,
  checkBadgeTabPhanQuyen,
  expectPickerPhanQuyenChiDoc,
  datQuyenDocLap,
  expectPickerPhanQuyenChinhSuaDuoc,
  DOC_PERM,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuThuMuc, DuLieu } from "./1.4.6.setup";

/**
 * ============================================================================
 * UC25 — 1.4.6 Cập nhật quyền của thư mục, tài liệu trong Cấu trúc hồ sơ
 * Case 608 (QA): Kiểm tra chức năng cập nhật phân quyền của TL
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE ─────────────────────────────────────────────────────
 * Tiền điều kiện (chung của bộ 1.4.6):
 *   - Thủ thư / ITAdmin / Người dùng được phân quyền Tạo mới bộ hồ sơ, BHS ở
 *     trạng thái Khai báo hoặc Đang hoạt động.
 *   - Người dùng / Nhóm (AUTO_GROUP_ECM06, có ecm06) được phân quyền Owner
 *     của TM/TL, trạng thái TL đang hoạt động.
 *   - Người dùng / Nhóm được phân quyền Cập nhật tại TM/TL, trạng thái TL đang
 *     hoạt động.
 * Thao tác:
 *   1. Mở màn hình Chi tiết TL
 *   2. Tại menu [...] chọn Kiểm tra phân quyền
 *   3. Click Đặt quyền độc lập
 *   4. Click Xác nhận
 * Mong muốn:
 *   Màn hình enable chỉnh sửa các trường: Quyền Owner, Quyền Tạo mới,
 *   Quyền Cập nhật, Quyền tải file, Quyền xem.
 *   (Phần "Quy tắc cập nhật các trường theo PL 03. Tạo TL" không kiểm ở case này —
 *   đã có trong khảo sát modal Tạo mới tài liệu.)
 *
 * Đây là bản dành cho **Tài liệu** của case 586 (làm trên Thư mục).
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B1. Mở Bộ hồ sơ → tab "Cấu trúc hồ sơ" → click tên tài liệu → màn chi tiết TL
 *     mở đè lên màn Bộ hồ sơ.
 * B2. Hover nút "..." trên đầu màn chi tiết TL → chọn "Kiểm tra phân quyền" →
 *     mở màn "Cập nhật quyền tài liệu <mã tài liệu>". Kiểm tra trạng thái ban đầu:
 *     nhãn "Kế thừa", 5 trường quyền chỉ hiển thị người đang kế thừa, không nhập được.
 * B3. Bấm "Đặt quyền độc lập" ở thanh thông báo đầu màn hình.
 * B4. Hộp thoại "Đặt quyền độc lập?" → bấm "Xác nhận" → nhãn đổi sang "Độc lập".
 * Mong muốn. Kiểm tra cả 5 trường đã cho chỉnh sửa: với từng trường, script bấm vào ô,
 *     gõ thử "ECM05", xác nhận hệ thống trả về gợi ý người dùng, rồi xoá chữ vừa gõ đi.
 *     Không chọn ai và **không bấm Xác nhận ở cuối màn** — quyền của tài liệu giữ nguyên.
 *
 * ── 5 TEST = 5 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 tài liệu       | Trạng thái BHS |
 * |---|-------------------|-----------------|----------------------------------|----------------|
 * | 1 | Thủ thư (ecm01)   | chính nó        | Owner (vì tự tạo BHS)            | Khai báo       |
 * | 2 | Admin   (ecm09)   | chính nó        | Owner (vì tự tạo BHS)            | Khai báo       |
 * | 3 | ecm06             | Thủ thư         | Owner — cấp ở BHS, TL kế thừa    | Hoạt động      |
 * | 4 | ecm06 (qua nhóm)  | Thủ thư         | Owner cấp cho AUTO_GROUP_ECM06   | Hoạt động      |
 * | 5 | ecm05             | Thủ thư         | Cập nhật — cấp ở BHS, TL kế thừa | Hoạt động      |
 *
 * Dữ liệu mỗi test (xem `1.4.6.setup.ts`):
 *     BHS  (Owner = người tạo; test 3–5 cấp thêm quyền cho vai cần test)
 *      └─ 1 thư mục ở gốc BHS, đang KẾ THỪA
 *          └─ 1 tài liệu, đang KẾ THỪA        ← tài liệu case thao tác trên
 *
 * - Tài liệu lấy quyền **qua kế thừa từ BHS** nên vẫn ở trạng thái "Kế thừa" →
 *   vẫn còn nút "Đặt quyền độc lập" để bấm.
 * - 5 test dùng **5 BHS tách biệt**, tên có timestamp riêng → chạy song song được.
 *
 * ⚠️ Với vai không phải người tạo BHS (test 3–5), chưa khảo sát được là họ có thấy nút "..."
 *    trên màn chi tiết TL hay không (vai VIEW ở màn BHS thì không có) — đây chính là
 *    phép thử đầu tiên. Xem KHO-TAI-LIEU.MODAL-CAP-NHAT-QUYEN-TAI-LIEU.md mục 7.
 */

/** B1 → B4 + assert mong muốn — dùng chung cho mọi vai */
const capNhatPhanQuyenTaiLieu = async (userPage: Page, duLieu: DuLieu) => {
  await test.step("1 + 2. Mở chi tiết Tài liệu → menu [...] → Kiểm tra phân quyền", async () => {
    await openChiTietTaiLieu(userPage, duLieu.recordUrl, duLieu.tenTaiLieuCon);
    await openCapNhatQuyenTaiLieu(userPage);
    // Đang kế thừa: nhãn "Kế thừa", 5 trường quyền chỉ đọc (chưa có ô nhập nào)
    await checkBadgeTabPhanQuyen(userPage, "Kế thừa");
    await expectPickerPhanQuyenChiDoc(userPage);
  });

  await test.step('3 + 4. Click "Đặt quyền độc lập" rồi click "Xác nhận"', async () => {
    await datQuyenDocLap(userPage, getThuMucModal(userPage));
  });

  await test.step("Mong muốn: enable chỉnh sửa Quyền Owner / Tạo mới / Cập nhật / Tải file / Xem", async () => {
    await expectPickerPhanQuyenChinhSuaDuoc(userPage);
  });
};

/* -------------------------------------------------------------------------- */
/* Vai tự tạo BHS (Thủ thư / Admin)                                            */
/* -------------------------------------------------------------------------- */

const runTestOwnerBoHoSo = async (page: Page, maCase: string) => {
  const duLieu = await dungDuLieuThuMuc(page, {
    maCase: `608-${maCase}`,
    taoItemCon: true,
  });
  await capNhatPhanQuyenTaiLieu(page, duLieu);
};

/**
 * TEST 1 — Thủ thư (ecm01). Tự tạo BHS `AT-UC25-608-TT-<ts>` (Khai báo) →
 * thư mục + tài liệu bên trong, tài liệu đang kế thừa quyền Owner của chính nó.
 */
test(
  "UC25 608 - Kiểm tra chức năng cập nhật phân quyền của TL - 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, chỉ khác tài khoản. */
test(
  "UC25 608 - Kiểm tra chức năng cập nhật phân quyền của TL - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTestOwnerBoHoSo(admin, "AD");
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền tại tài liệu (không phải người tạo BHS)                 */
/* -------------------------------------------------------------------------- */

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

/** TEST 3 — `ecm06` được phân quyền **Owner** (cấp ở BHS, tài liệu kế thừa). */
test(
  "UC25 608 - Kiểm tra chức năng cập nhật phân quyền của TL - Người dùng có quyền Owner tại TLecm06",
  async ({ librarian, ecm06 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm06, "OWN", {
      account: "ecm06",
      permTestId: DOC_PERM.OWNER,
    });
  },
);

/**
 * TEST 4 — **NHÓM** `AUTO_GROUP_ECM06` được phân quyền **Owner**; thao tác bằng `ecm06`
 * (thành viên của nhóm) để kiểm tra quyền có hiệu lực qua nhóm.
 */
test(
  "UC25 608 - Kiểm tra chức năng cập nhật phân quyền của TL - Nhóm có quyền Owner tại TLecm06",
  async ({ librarian, ecm06 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm06, "GRP", {
      account: GROUP.ECM06,
      permTestId: DOC_PERM.OWNER,
    });
  },
);

/** TEST 5 — `ecm05` được phân quyền **Cập nhật** tại tài liệu. */
test(
  "UC25 608 - Kiểm tra chức năng cập nhật phân quyền của TL - Người dùng có quyền Cập nhật tại TLecm05",
  async ({ librarian, ecm05 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm05, "EDIT", {
      account: "ecm05",
      permTestId: DOC_PERM.EDIT,
    });
  },
);
