import { Page } from "@playwright/test";
import { test, ACCOUNT, GROUP } from "../../src/fixture/base-test";
import {
  openPhanQuyenNangCao,
  moItemPhanQuyen,
  getCodeCuaItemPhanQuyen,
  checkKeThua,
  checkNguoiCoQuyenO5Cot,
  checkQuyenGiongItemCha,
  layTenDoiTuongPhanQuyen,
  DoiTuongPhanQuyen,
  DOC_PERM,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuThuMuc, DuLieu } from "./1.4.6.setup";
import { capNhatVaLuuPhanQuyenThuMuc } 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 606 (QA): Kiểm tra phân quyền của các TM, TL con của thư mục vừa phân quyền
 * ============================================================================
 *
 * ── 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. Thực hiện cập nhật lại đối tượng phân quyền tại thư mục cha thành công
 *   2. Kiểm tra phân quyền của các TM, TL con
 * Mong muốn:
 *   Các TM/TL con được áp dụng quyền giống với quyền ở TM cha vừa cập nhật.
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B1. Cập nhật phân quyền cho thư mục cha rồi lưu (đúng chuỗi thao tác của case 587):
 *     mở màn cập nhật TM → "Đặt quyền độc lập" → "Xác nhận" → thêm 1 người dùng vào
 *     cả 5 trường quyền → "Xác nhận" để lưu → hệ thống báo "Thành công".
 * B2. 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
 *     cha để thấy thư mục con và tài liệu bên trong, rồi đối chiếu:
 *     - Thư mục cha: cột Kế thừa = "Quyền riêng tư", cả 5 cột quyền đều có người
 *       vừa thêm (xác nhận B1 đã lưu thành công, tránh so sánh với ô rỗng).
 *     - Thư mục con và Tài liệu: cột Kế thừa vẫn = "Kế thừa" (đúng tiền điều kiện),
 *       và **danh sách người ở cả 5 cột quyền giống hệt thư mục cha**.
 *
 * So sánh theo **tập hợp tên người** đọc từ từng ô quyền (`checkQuyenGiongItemCha`):
 * ô nào có nhiều hơn 2 người thì hàm tự bấm "+ n người khác" để đọc đủ.
 *
 * ── 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 thư mục        | Người thêm ở B1 | 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, TM 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, TM 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)
 *      └─ thư mục ở gốc BHS, đang KẾ THỪA      ← thư mục cha, case cập nhật quyền tại đây
 *          ├─ 1 thư mục con, đang KẾ THỪA      ← item con cần kiểm tra
 *          └─ 1 tài liệu, đang KẾ THỪA         ← item con cần kiểm tra
 *
 * - Test 3, 4 thao tác bằng `ecm06` nên B1 phải thêm người khác (`ecm07`) — thêm
 *   chính mình thì không chứng minh được gì vì `ecm06` đã có quyền kế thừa sẵ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 (xem
 *   KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md mục 2).
 * - 5 test dùng **5 BHS tách biệt**, tên có timestamp riêng, chạy trên phiên đăng
 *   nhập riêng → quyền của test này không đè lên test khác, chạy song song được.
 */

/**
 * B2 — Mong muốn: thư mục con và tài liệu con đang kế thừa phải có quyền **giống hệt**
 * thư mục cha vừa được cập nhật.
 * `ownerPage` phải là tài khoản Owner BHS (chỉ vai này mở được modal Phân quyền nâng cao).
 */
const checkItemConGiongThuMucCha = async (
  ownerPage: Page,
  duLieu: DuLieu,
  nguoiDuocThem: DoiTuongPhanQuyen,
) => {
  const tenHienThi = await layTenDoiTuongPhanQuyen(nguoiDuocThem);

  await test.step("2. Kiểm tra phân quyền của các TM, TL con", async () => {
    await openPhanQuyenNangCao(ownerPage, duLieu.recordUrl);

    // --- Thư mục cha: đã tách kế thừa và đã nhận người mới (chứng minh B1 lưu thành công) ---
    const codeCha = await getCodeCuaItemPhanQuyen(ownerPage, duLieu.tenThuMuc);
    await checkKeThua(ownerPage, codeCha, "Quyền riêng tư", duLieu.tenThuMuc);
    await checkNguoiCoQuyenO5Cot(
      ownerPage,
      codeCha,
      tenHienThi,
      duLieu.tenThuMuc,
    );

    // --- Item con: bảng là cây nên phải expand thư mục cha mới thấy dòng con ---
    await moItemPhanQuyen(ownerPage, codeCha);

    for (const tenItemCon of [duLieu.tenThuMucCon, duLieu.tenTaiLieuCon]) {
      const codeCon = await getCodeCuaItemPhanQuyen(ownerPage, tenItemCon);
      // Tiền điều kiện: item con vẫn đang áp dụng kế thừa
      await checkKeThua(ownerPage, codeCon, "Kế thừa", tenItemCon);
      // Mong muốn: quyền của item con giống hệt thư mục cha ở cả 5 cột
      await checkQuyenGiongItemCha(
        ownerPage,
        codeCha,
        codeCon,
        duLieu.tenThuMuc,
        tenItemCon,
      );
    }
  });
};

/* -------------------------------------------------------------------------- */
/* 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: `606-${maCase}`,
    taoItemCon: true,
  });

  await capNhatVaLuuPhanQuyenThuMuc(page, duLieu, nguoiDuocThem.account);
  await checkItemConGiongThuMucCha(page, duLieu, nguoiDuocThem);
};

/**
 * TEST 1 — Thủ thư (ecm01), vai "được phân quyền Tạo mới bộ hồ sơ".
 * Tự tạo BHS `AT-UC25-606-TT-<ts>` (Khai báo) → thư mục + thư mục con + tài liệu.
 * B1 thêm `ecm06` vào cả 5 trường quyền của thư mục cha.
 */
test(
  "UC25 606 - Kiểm tra phân quyền của các TM, TL con của thư mục vừa phân quyền - 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, chỉ khác tài khoản.
 */
test(
  "UC25 606 - Kiểm tra phân quyền của các TM, TL con của thư mục vừa phân quyền - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm06 }) => {
    await runTestOwnerBoHoSo(admin, "AD", {
      account: "ecm06",
      page: ecm06,
    });
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền tại thư mục (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: `606-${maCase}`,
    quyenBanDau: { permTestId: vai.permTestId, account: vai.account },
    taoItemCon: true,
    chuyenSangHoatDong: true,
  });

  await capNhatVaLuuPhanQuyenThuMuc(userPage, duLieu, nguoiDuocThem.account);
  await checkItemConGiongThuMucCha(librarian, duLieu, nguoiDuocThem);
};

/**
 * TEST 3 — `ecm06` được phân quyền **Owner** (cấp ở BHS, thư mục kế thừa).
 * B1 thêm `ecm07`.
 */
test(
  "UC25 606 - Kiểm tra phân quyền của các TM, TL con của thư mục vừa phân quyền - Người dùng có quyền Owner tại TMecm06",
  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 phân quyền **Owner**; thao tác bằng
 * `ecm06` (thành viên của nhóm). B1 thêm `ecm07`.
 */
test(
  "UC25 606 - Kiểm tra phân quyền của các TM, TL con của thư mục vừa phân quyền - Nhóm có quyền Owner tại TMecm06",
  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** — nhánh tiền điều kiện
 * "Người dùng/Nhóm được phân quyền Cập nhật tại TM/TL". B1 thêm `ecm06`.
 */
test(
  "UC25 606 - Kiểm tra phân quyền của các TM, TL con của thư mục vừa phân quyền - Người dùng có quyền Cập nhật tại TMecm05",
  async ({ librarian, ecm05, ecm06 }) => {
    await runTestVaiDuocPhanQuyen(
      librarian,
      ecm05,
      "EDIT",
      { account: "ecm05", permTestId: DOC_PERM.EDIT },
      { account: "ecm06", page: ecm06 },
    );
  },
);
