import { Page } from "@playwright/test";
import { test, ACCOUNT, GROUP } from "../../src/fixture/base-test";
import {
  openPhanQuyenNangCao,
  moItemPhanQuyen,
  getCodeCuaItemPhanQuyen,
  checkKeThua,
  checkNguoiCoQuyenO5Cot,
  layTenDoiTuongPhanQuyen,
  DoiTuongPhanQuyen,
  DOC_PERM,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuThuMuc, DuLieu } from "./1.4.6.setup";
import { capNhatVaLuuQuyenTaiLieu } from "./1.4.6.steps";

/**
 * ============================================================================
 * 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 609 (QA): Kiểm tra Lưu cập nhật phân quyền cho TL — TL đang KẾ THỪA
 * ============================================================================
 *
 * ── 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.
 * Tiền điều kiện thêm:
 *   - **TM/TL con đang áp dụng kế thừa quyền.**
 * Thao tác:
 *   1. Mở màn hình Kiểm tra phân quyền của TL
 *   2. Thực hiện cập nhật lại các đối tượng được phân quyền
 *   3. Nhấn Xác nhận
 * Mong muốn:
 *   - Các đối tượng phân quyền được cập nhật thành công
 *   - Chuyển trạng thái kế thừa của TL thành **Quyền riêng tư**
 *
 * ── 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 →
 *     hover nút "..." → "Kiểm tra phân quyền" → màn "Cập nhật quyền tài liệu".
 * B1b. Tài liệu đang kế thừa nên **phải bấm "Đặt quyền độc lập" + "Xác nhận" trước**:
 *     lúc còn kế thừa app không render ô nhập nào, không sửa được đối tượng phân quyền
 *     (đã khảo sát 2026-07-29 — xem KHO-TAI-LIEU.MODAL-CAP-NHAT-QUYEN-TAI-LIEU.md mục 3a).
 * B2. Cập nhật lại đối tượng phân quyền: thêm 1 người dùng vào **cả 5 trường quyền**.
 * B3. Nhấn "Xác nhận" ở cuối màn → hệ thống báo "Đang xử lý" rồi "Thành công",
 *     màn hình tự đóng.
 * Mong muốn. Mở "Kiểm tra phân quyền" của Bộ hồ sơ bằng tài khoản Owner BHS, mở rộng thư mục
 *     rồi đối chiếu dòng tài liệu:
 *     - Cột Kế thừa = **"Quyền riêng tư"** (trước đó là "Kế thừa")
 *     - Cả 5 cột quyền đều có người vừa thêm → cập nhật thành công
 *
 * ── 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       | Người thêm ở B2 | Trạng thái BHS |
 * |---|-------------------|-----------------|----------------------------------|-----------------|----------------|
 * | 1 | Thủ thư (ecm01)   | chính nó        | Owner (vì tự tạo BHS)            | ecm06           | Khai báo       |
 * | 2 | Admin   (ecm09)   | chính nó        | Owner (vì tự tạo BHS)            | ecm06           | Khai báo       |
 * | 3 | ecm06             | Thủ thư         | Owner — cấp ở BHS, TL kế thừa    | ecm07           | Hoạt động      |
 * | 4 | ecm06 (qua nhóm)  | Thủ thư         | Owner cấp cho AUTO_GROUP_ECM06   | ecm07           | Hoạt động      |
 * | 5 | ecm05             | Thủ thư         | Cập nhật — cấp ở BHS, TL kế thừa | ecm06           | 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
 *
 * - Phần kiểm tra kết quả **luôn dùng tài khoản Owner BHS** (người tạo BHS): modal
 *   "Phân quyền nâng cao" chỉ Owner BHS mở được.
 * - Test 3, 4 thao tác bằng `ecm06` nên B2 thêm người khác (`ecm07`).
 */

/** Mong muốn: TL chuyển sang "Quyền riêng tư" và nhận đủ quyền cho người vừa thêm */
const checkTaiLieuThanhQuyenRiengTu = async (
  ownerPage: Page,
  duLieu: DuLieu,
  nguoiDuocThem: DoiTuongPhanQuyen,
) => {
  const tenHienThi = await layTenDoiTuongPhanQuyen(nguoiDuocThem);

  await test.step(`Mong muốn: TL chuyển "Quyền riêng tư" và có "${tenHienThi}" ở cả 5 quyền`, async () => {
    await openPhanQuyenNangCao(ownerPage, duLieu.recordUrl);

    // Bảng là cây → expand thư mục cha mới thấy dòng tài liệu
    const codeThuMuc = await getCodeCuaItemPhanQuyen(ownerPage, duLieu.tenThuMuc);
    await moItemPhanQuyen(ownerPage, codeThuMuc);

    const codeTaiLieu = await getCodeCuaItemPhanQuyen(
      ownerPage,
      duLieu.tenTaiLieuCon,
    );
    await checkKeThua(
      ownerPage,
      codeTaiLieu,
      "Quyền riêng tư",
      duLieu.tenTaiLieuCon,
    );
    await checkNguoiCoQuyenO5Cot(
      ownerPage,
      codeTaiLieu,
      tenHienThi,
      duLieu.tenTaiLieuCon,
    );
  });
};

/* -------------------------------------------------------------------------- */
/* Vai tự tạo BHS (Thủ thư / Admin) — vừa thao tác vừa kiểm tra kết quả        */
/* -------------------------------------------------------------------------- */

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

  await capNhatVaLuuQuyenTaiLieu(page, duLieu, nguoiDuocThem.account, {
    datQuyenDocLapTruoc: true,
  });
  await checkTaiLieuThanhQuyenRiengTu(page, duLieu, nguoiDuocThem);
};

/** TEST 1 — Thủ thư (ecm01), BHS `AT-UC25-609-TT-<ts>` trạng thái Khai báo. */
test(
  "UC25 609 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL đang kế thừa) - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian, ecm06 }) => {
    await runTestOwnerBoHoSo(librarian, "TT", {
      account: "ecm06",
      page: ecm06,
    });
  },
);

/** TEST 2 — ITAdmin (ecm09). Dữ liệu & thao tác y hệt TEST 1. */
test(
  "UC25 609 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL đang kế thừa) - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm06 }) => {
    await runTestOwnerBoHoSo(admin, "AD", {
      account: "ecm06",
      page: ecm06,
    });
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền tại tài liệu (không phải người tạo BHS)                 */
/* Thủ thư dựng dữ liệu + kiểm tra kết quả, vai kia thực hiện thao tác          */
/* -------------------------------------------------------------------------- */

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

  await capNhatVaLuuQuyenTaiLieu(userPage, duLieu, nguoiDuocThem, {
    datQuyenDocLapTruoc: true,
  });
  await checkTaiLieuThanhQuyenRiengTu(librarian, duLieu, nguoiDuocThem);
};

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

/** TEST 4 — **NHÓM** `AUTO_GROUP_ECM06` có quyền Owner; thao tác bằng `ecm06`. B2 thêm `ecm07`. */
test(
  "UC25 609 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL đang kế thừa) - Nhóm có quyền Owner tại TLecm06",
  async ({ librarian, ecm06, ecm07 }) => {
    await runTestVaiDuocPhanQuyen(
      librarian,
      ecm06,
      "GRP",
      { account: GROUP.ECM06, permTestId: DOC_PERM.OWNER },
      { account: "ecm07", page: ecm07 },
    );
  },
);

/** TEST 5 — `ecm05` được phân quyền **Cập nhật** tại tài liệu. B2 thêm `ecm06`. */
test(
  "UC25 609 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL đang kế thừa) - Người dùng có quyền Cập nhật tại TLecm05",
  async ({ librarian, ecm05, ecm06 }) => {
    await runTestVaiDuocPhanQuyen(
      librarian,
      ecm05,
      "EDIT",
      { account: "ecm05", permTestId: DOC_PERM.EDIT },
      { account: "ecm06", page: ecm06 },
    );
  },
);
