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 610 (QA): Kiểm tra Lưu cập nhật phân quyền cho TL — TL đã có QUYỀN RIÊNG TƯ
 * ============================================================================
 *
 * ── 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 KHÔNG áp dụng kế thừa quyền — TM/TL con quyền riêng tư.**
 * 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
 *   - **Giữ nguyên** trạng thái kế thừa của TL là Quyền riêng tư
 *
 * (Mặt ngược của case 609: 609 đi từ TL đang kế thừa → chuyển thành Quyền riêng tư;
 * 610 đi từ TL đã là Quyền riêng tư → vẫn phải giữ nguyên Quyền riêng tư.)
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B0. Dựng tiền điều kiện thêm — tài khoản Owner BHS mở "Kiểm tra phân quyền" của TL →
 *     "Đặt quyền độc lập" → "Xác nhận" → nhấn "Xác nhận" ở cuối màn để **lưu**.
 *     Sau bước này tài liệu đã ở trạng thái Quyền riêng tư (đã kiểm chứng 2026-07-29:
 *     mở lại vẫn thấy nhãn "Độc lập").
 * B1. Vai cần test mở lại màn "Kiểm tra phân quyền" của TL — lần này tài liệu đã có
 *     quyền riêng nên **các trường quyền sửa được ngay**, không cần đặt quyền độc lập nữa.
 * 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 → "Đang xử lý" → "Thành công", màn hình tự đóng.
 * Mong muốn. Owner BHS mở "Kiểm tra phân quyền" của Bộ hồ sơ, mở rộng thư mục rồi đối chiếu
 *     dòng tài liệu: cột Kế thừa **vẫn** = "Quyền riêng tư", và cả 5 cột quyền đều có
 *     người vừa thêm.
 *
 * ── 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 + B0 | 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 → B0 chuyển sang QUYỀN RIÊNG TƯ   ← tài liệu case thao tác trên
 *
 * ⚠️ B0 chuyển TL sang quyền riêng bằng thao tác UI (đặt quyền độc lập + lưu) chứ không tick
 *    "Break quyền riêng" lúc tạo tài liệu — cách này đã được kiểm chứng trực tiếp, còn checkbox
 *    lúc tạo thì chưa xác minh là có sinh ra trạng thái "Quyền riêng tư" hay không.
 */

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

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

    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) — tự dựng B0, thao tác và kiểm tra          */
/* -------------------------------------------------------------------------- */

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

  // B0: chuyển tài liệu sang quyền riêng tư (không thêm ai)
  await capNhatVaLuuQuyenTaiLieu(page, duLieu, undefined, {
    datQuyenDocLapTruoc: true,
    moTa: "B0 — dựng tiền điều kiện: TL quyền riêng tư",
  });

  // B1–B3: tài liệu đã quyền riêng → sửa thẳng, không cần đặt quyền độc lập nữa
  await capNhatVaLuuQuyenTaiLieu(page, duLieu, nguoiDuocThem.account);
  await checkTaiLieuGiuQuyenRiengTu(page, duLieu, nguoiDuocThem);
};

/** TEST 1 — Thủ thư (ecm01), BHS `AT-UC25-610-TT-<ts>` trạng thái Khai báo. */
test(
  "UC25 610 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL quyền riêng tư) - 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 610 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL quyền riêng tư) - 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 + B0 + 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: `610-${maCase}`,
    quyenBanDau: { permTestId: vai.permTestId, account: vai.account },
    taoItemCon: true,
    chuyenSangHoatDong: true,
  });

  await capNhatVaLuuQuyenTaiLieu(librarian, duLieu, undefined, {
    datQuyenDocLapTruoc: true,
    moTa: "B0 — dựng tiền điều kiện: TL quyền riêng tư",
  });

  await capNhatVaLuuQuyenTaiLieu(userPage, duLieu, nguoiDuocThem.account);
  await checkTaiLieuGiuQuyenRiengTu(librarian, duLieu, nguoiDuocThem);
};

/** TEST 3 — `ecm06` được phân quyền **Owner** (cấp ở BHS). B2 thêm `ecm07`. */
test(
  "UC25 610 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL quyền riêng tư) - 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 610 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL quyền riêng tư) - 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 610 - Kiểm tra Lưu cập nhật phân quyền cho TL (TL quyền riêng tư) - 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 },
    );
  },
);
