import { Page } from "@playwright/test";
import { test, ACCOUNT, GROUP } from "../../src/fixture/base-test";
import {
  openManCapNhatThuMuc,
  openTabThuMuc,
  getThuMucModal,
  checkBadgeTabPhanQuyen,
  expectPickerPhanQuyenChiDoc,
  datQuyenDocLap,
  expectPickerPhanQuyenChinhSuaDuoc,
  DOC_PERM,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuThuMuc } 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 586 (QA): Kiểm tra chức năng cập nhật phân quyền của Thư mục
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE ─────────────────────────────────────────────────────
 * Tiền điều kiện:
 *   - 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 cập nhật TM
 *   2. Click Đặt quyền độc lập
 *   3. 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.
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B1. Mở Bộ hồ sơ → vào tab "Cấu trúc hồ sơ" → mở menu của dòng thư mục cần test
 *     → chọn "Cập nhật" → màn hình "Cập nhật thư mục <tên TM>" hiện ra.
 *     Vào tab "Phân quyền", kiểm tra trạng thái ban đầu: tab hiển thị nhãn
 *     "Kế thừa", 5 trường quyền chỉ hiển thị người đang kế thừa và không nhập được.
 * B2. Bấm "Đặt quyền độc lập" ở thanh thông báo đầu màn hình.
 * B3. Hộp thoại xác nhận hiện ra → bấm "Xác nhận" → nhãn của tab đổi từ
 *     "Kế thừa" sang "Độc lập".
 * Mong muốn. Kiểm tra cả 5 trường Quyền Owner / Tạo mới / Cập nhật / Tải file /
 *     Xem đã 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 lưu — dữ liệu quyền của thư mục giữ nguyên như trướ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      | 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, TM 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, TM kế thừa | Hoạt động    |
 *
 * Dữ liệu mỗi test đều chỉ có 1 cấp — không cần thư mục con:
 *     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 quyền  ← thư mục case thao tác trên
 *
 * - Vai cần test lấy quyền tại thư mục **qua kế thừa từ BHS** (cấp quyền ngay lúc
 *   tạo BHS). Nhờ vậy thư mục vẫn ở trạng thái "Kế thừa" → vẫn còn nút
 *   "Đặt quyền độc lập" để thao tác. Cấp quyền trực tiếp lên thư mục thì buộc phải
 *   ngắt kế thừa trước, mà ngắt rồi là mất nút đó.
 * - Test 3–5 chuyển BHS sang "Hoạt động" theo đúng tiền điều kiện "trạng thái TL
 *   đang hoạt động" (đây cũng là điều kiện để vai không phải người tạo mở được BHS —
 *   xem KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md mục 1).
 * - 5 test dùng **5 BHS tách biệt**, tên có timestamp riêng, chạy trên 5 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.
 */

/** Bước 1→3 + assert mong muốn — dùng chung cho mọi vai */
const capNhatPhanQuyenThuMuc = async (
  userPage: Page,
  recordUrl: string,
  tenThuMuc: string,
) => {
  await test.step("1. Mở màn hình cập nhật Thư mục → tab Phân quyền", async () => {
    await openManCapNhatThuMuc(userPage, recordUrl, tenThuMuc);
    await openTabThuMuc(userPage, "Phân quyền");
    // Đang kế thừa: badge "Kế thừa", 5 trường quyền chỉ đọc (chưa có ô nhập)
    await checkBadgeTabPhanQuyen(userPage, "Kế thừa");
    await expectPickerPhanQuyenChiDoc(userPage);
  });

  await test.step('2 + 3. 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) — chính là Owner của BHS lẫn thư mục       */
/* -------------------------------------------------------------------------- */

const runTestOwnerBoHoSo = async (page: Page, maCase: string) => {
  const duLieu = await dungDuLieuThuMuc(page, { maCase: `586-${maCase}` });
  await capNhatPhanQuyenThuMuc(page, duLieu.recordUrl, duLieu.tenThuMuc);
};

/**
 * TEST 1 — Thủ thư (ecm01), là vai "được phân quyền Tạo mới bộ hồ sơ".
 * Dữ liệu: BHS `AT-UC25-586-TT-<ts>` (Khai báo) → 1 thư mục ở gốc BHS, đang kế thừa.
 * Quyền của vai tại TM: Owner (kế thừa từ BHS do chính nó tạo).
 */
test(
  "UC25 586 - Kiểm tra chức năng cập nhật phân quyền của Thư mục - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTestOwnerBoHoSo(librarian, "TT");
  },
);

/**
 * TEST 2 — ITAdmin (ecm09). Dữ liệu & quyền y hệt TEST 1, chỉ khác tài khoản.
 * Dữ liệu: BHS `AT-UC25-586-AD-<ts>` (Khai báo) → 1 thư mục ở gốc BHS, đang kế thừa.
 */
test(
  "UC25 586 - Kiểm tra chức năng cập nhật phân quyền của Thư mục - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTestOwnerBoHoSo(admin, "AD");
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền tại THƯ MỤC (không phải Owner BHS)                      */
/* -------------------------------------------------------------------------- */

/**
 * Thủ thư dựng dữ liệu cho vai không phải người tạo BHS: BHS (cấp quyền cho `nguoiNhan`
 * ngay khi tạo) → 1 thư mục ở gốc BHS đang kế thừa → chuyển BHS sang "Hoạt động".
 *
 * Vai cần test có quyền tại thư mục **qua kế thừa từ BHS**, nên thư mục vẫn ở trạng thái
 * "Kế thừa" và vẫn còn nút "Đặt quyền độc lập" để case thao tác.
 *
 * @param nguoiNhan  account id hoặc **tên nhóm** người dùng
 * @param permTestId trường quyền ở form tạo BHS — dùng hằng `DOC_PERM`
 */
const dungDuLieuPhanQuyenTaiThuMuc = (
  librarian: Page,
  maCase: string,
  nguoiNhan: string,
  permTestId: string,
) =>
  dungDuLieuThuMuc(librarian, {
    maCase: `586-${maCase}`,
    quyenBanDau: { permTestId, account: nguoiNhan },
    chuyenSangHoatDong: true,
  });

/**
 * TEST 3 — ecm06 được phân quyền **Owner** tại thư mục.
 * Dữ liệu Thủ thư dựng: BHS `AT-UC25-586-OWN-<ts>` (trường "Quyền Owner" thêm `ecm06`)
 * → thư mục `...-OWN-TM-<ts>` ở gốc BHS, kế thừa quyền Owner đó → BHS chuyển "Hoạt động".
 */
test("UC25 586 - Kiểm tra chức năng cập nhật phân quyền của Thư mục - Người dùng có quyền Owner tại TMecm06", async ({
  librarian,
  ecm06,
}) => {
  const { recordUrl, tenThuMuc } = await dungDuLieuPhanQuyenTaiThuMuc(
    librarian,
    "OWN",
    "ecm06",
    DOC_PERM.OWNER,
  );
  await capNhatPhanQuyenThuMuc(ecm06, recordUrl, tenThuMuc);
});

/**
 * TEST 4 — **NHÓM** `AUTO_GROUP_ECM06` được phân quyền **Owner**; đăng nhập bằng `ecm06`
 * (thành viên của nhóm) để kiểm tra quyền có hiệu lực qua nhóm.
 * Dữ liệu Thủ thư dựng: BHS `AT-UC25-586-GRP-<ts>` (trường "Quyền Owner" thêm **tên nhóm**)
 * → thư mục ở gốc BHS, kế thừa → BHS "Hoạt động".
 * Khác TEST 3 duy nhất ở chỗ người nhận quyền là nhóm chứ không phải cá nhân.
 */
test("UC25 586 - Kiểm tra chức năng cập nhật phân quyền của Thư mục - Nhóm có quyền Owner tại TMecm06", async ({
  librarian,
  ecm06,
}) => {
  // Cấp quyền cho nhóm dùng chung 1 thao tác với user: gõ tên nhóm vào people-picker rồi Enter
  const { recordUrl, tenThuMuc } = await dungDuLieuPhanQuyenTaiThuMuc(
    librarian,
    "GRP",
    GROUP.ECM06,
    DOC_PERM.OWNER,
  );
  await capNhatPhanQuyenThuMuc(ecm06, recordUrl, tenThuMuc);
});
