import { Page } from "@playwright/test";
import { test, ACCOUNT, GROUP } from "../../src/fixture/base-test";
import {
  DOC_PERM,
  FOLDER_PICKER,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuXoaThuMuc } from "./1.4.7.setup";
import { xoaTaiLieuTrongCauTruc, expectDaXoaTaiLieu } from "./1.4.7.steps";

/**
 * UC?? — 1.4.7.618
 * **Kiểm tra chức năng xóa 1 Tài liệu trong cấu trúc hồ sơ**
 *
 * Thao tác (nguyên văn):
 * 1. dùng admin tạo 1 bộ hồ sơ, phân quyền cho ECM05 làm owner của bộ hồ sơ sau đó tạo 3 folder,
 *    folder thứ 3 phân quyền owner cho ecm07, folder thứ 4 phân quyền owner cho AUTO_GROUP_ECM06,
 *    tạo 1 tài liệu, phân quyền owner trên tài liệu đó cho ecm08
 * 2. bên trong mỗi folder tạo 1 tài liệu tương ứng. sau đó chuyển hoạt động bộ hồ sơ
 * 3. Dùng admin xóa tài liệu bên trong thư mục 1, ecm05 xóa tài liệu bên trong thư mục 2, ecm07 xóa
 *    tài liệu bên trong thư mục 3, ecm06 xóa tài liệu bên trong thư mục 4, ecm08 xóa tài liệu user
 *    này owner. thành công hết là được
 *
 * **Tiền điều kiện chung của mục** (tiền điều kiện QA + bảng vai → cách dựng dữ liệu):
 * [`1.4.7.md`](./1.4.7.md). File đó **chỉ** chứa tiền điều kiện chung; toàn bộ logic / kỳ vọng /
 * giả định của case này nằm trong khối comment dưới đây.
 *
 * ---
 *
 * ## Cách case này được viết
 *
 * - **Dựng 4 thư mục, không phải 3**: mô tả ghi "tạo 3 folder" nhưng ngay sau đó nói tới "folder thứ
 *   4", và bước 3 yêu cầu 4 vai xoá tài liệu trong 4 thư mục khác nhau → số 3 là lỗi gõ, số thư mục
 *   thực tế cần là **4** (khớp case 616 của cùng mục, cùng cấu trúc dữ liệu).
 * - **1 test duy nhất, 5 vai thao tác trên cùng 1 BHS**: 5 lần xoá là 5 nhánh quyền khác nhau của
 *   *cùng* một cấu trúc dữ liệu (admin = người tạo BHS, `ecm05` = Owner **BHS**, `ecm07` = Owner
 *   **thư mục 3**, `ecm06` = thành viên nhóm `AUTO_GROUP_ECM06` = Owner **thư mục 4**, `ecm08` =
 *   Owner **1 tài liệu ở gốc BHS**). Tách thành 5 test sẽ phải dựng lại BHS + 4 thư mục + 5 tài liệu
 *   5 lần (setup là phần chậm nhất) mà không phủ thêm gì. Đổi lại: 1 nhánh fail thì các nhánh sau
 *   **không chạy** — muốn chạy độc lập thì tách `runTest` thành nhiều test, mỗi test gọi
 *   `dungDuLieuXoaThuMuc` với `soThuMuc: 1`.
 * - **Đối tượng bị xoá ở case này là TÀI LIỆU** (khác 616 — xoá thư mục có dữ liệu bên trong):
 *   tài liệu là item **rỗng** nên app dùng dialog `XOA_CONFIRM.RONG`
 *   (`"Bạn có chắc chắn muốn xóa?"`, nút theo nhãn `Xác nhận` — `KHO-TAI-LIEU.md` mục 4.4), không
 *   phải dialog cảnh báo xoá lan xuống. Nội dung dialog lệch mong đợi → `expect.soft` cảnh báo,
 *   thao tác xoá **vẫn chạy tiếp** (test vẫn fail ở cuối, không mất kết quả kiểm tra text).
 * - **Kèm assert "thư mục chứa tài liệu vẫn còn"** sau mỗi lần xoá: đây là điểm phân biệt case này
 *   với 616 — xoá 1 tài liệu **không được** kéo theo thư mục cha.
 * - **Quyền của từng vai được dựng ở đúng cấp mà QA nêu**:
 *   - `ecm05`: Owner **cấp BHS** — gán ở people-picker lúc `createBoHoSo` (khối "Phân quyền truy cập"
 *     trên màn chi tiết bị app ẩn nên đây là chỗ duy nhất gán lúc tạo — `KHO-TAI-LIEU.md` mục 4.6).
 *     Quyền cấp lớn bao trùm cấp nhỏ (`CLAUDE.md`) → `ecm05` cũng là Owner của tài liệu trong TM2.
 *   - `ecm07` / nhóm `AUTO_GROUP_ECM06`: Owner **cấp thư mục** — thư mục 3/4 được **"Đặt quyền độc
 *     lập"** rồi thêm vào trường "Quyền Owner"; tài liệu bên trong **kế thừa** quyền đó.
 *   - `ecm08`: Owner **cấp tài liệu** — tài liệu ở gốc BHS được tick **"Break quyền riêng"** rồi thêm
 *     `ecm08` vào "Quyền Owner". Cấp quyền trực tiếp lên 1 TM/TL **buộc phải tách kế thừa trước**
 *     (`PHAN-QUYEN-THEO-VAI.md` mục 4).
 *   - Setup **không** xoá chip kế thừa ở thư mục 3/4 và ở tài liệu gốc → admin và `ecm05` vẫn giữ
 *     quyền tại đó (`MODAL-TAO-TAI-LIEU.md` mục 4). Cần thiết cho bước kiểm chứng cuối bằng phiên
 *     admin.
 * - **`chuyenHoatDong` sau khi tạo xong toàn bộ cấu trúc**: 4 trong 5 vai thao tác không phải người
 *   tạo BHS, mà vai đó chỉ mở được BHS khi BHS ở trạng thái "Hoạt động"
 *   (`PHAN-QUYEN-THEO-VAI.md` mục 1). Chuyển hoạt động **sau cùng** đúng thứ tự QA mô tả và cũng
 *   tránh việc trạng thái BHS ảnh hưởng tới các bước tạo dữ liệu.
 * - **Kỳ vọng "xoá thành công" đo ở 2 chỗ**: ngay sau mỗi lần xoá (bảng của vai vừa xoá, không mở lại
 *   BHS — xem JSDoc `xoaTaiLieuTrongCauTruc`) và **một lần cuối bằng phiên admin**
 *   (`expectDaXoaTaiLieu`: 5 tài liệu phải mất, 4 thư mục phải còn). Chỉ assert ở chỗ đầu thì không
 *   tách được "đã xoá" với "vai đó mất quyền xem nhánh vừa xoá" — bảng Cấu trúc hồ sơ bị app lọc
 *   theo quyền (`PHAN-QUYEN-THEO-VAI.md` mục 3).
 * - **Không assert toast sau khi xoá**: chưa khảo sát app có bắn toast `"Thành công"` khi xoá hay
 *   không → `xoaItemCauTruc` chỉ chờ toast "mềm", tín hiệu cứng là dòng biến mất khỏi bảng.
 *
 * ## Điểm cần QA/DEV chốt
 *
 * 1. **Số folder trong mô tả tự mâu thuẫn** ("tạo 3 folder" nhưng có "folder thứ 4") — case đang
 *    chạy với **4 folder**. Nếu QA thực sự chỉ muốn 3 folder thì bỏ vai `ecm06` khỏi bước 3 và đổi
 *    `soThuMuc: 3`.
 * 2. **Chưa khảo sát**: menu hành động của dòng (`mni-xoa`) với vai **không phải Owner BHS**
 *    (`PHAN-QUYEN-THEO-VAI.md` mục 5). Tiền điều kiện QA khẳng định Owner của thư mục/tài liệu xoá
 *    được item đó, nên case viết thẳng theo mô tả; nếu `ecm07` / `ecm06` / `ecm08` **không có** mục
 *    "Xóa" trong menu dòng thì đó là **kết quả test** cần QA/DEV kết luận, không phải lỗi script.
 * 3. **Chưa khảo sát**: tài liệu bị xoá đi vào "Quản lý cấu trúc đã xóa" (menu `btn-more` của BHS)
 *    hay bị xoá hẳn. Case chỉ assert **không còn trong bảng Cấu trúc hồ sơ**; nếu QA cần kiểm tra
 *    chúng nằm trong thùng rác thì bổ sung 1 case riêng (màn đó chưa có tài liệu).
 * 4. Case **không** kiểm tra nhánh **Hủy bỏ** ở dialog xoá (tài liệu phải còn nguyên) — kỳ vọng
 *    ngược lại nên thuộc **case riêng**.
 * 5. Tài liệu ở case này **không có file mềm đính kèm**. Chưa khảo sát app xử lý thế nào khi xoá tài
 *    liệu **đã có file** (có cảnh báo khác không, file có bị xoá theo không) → nếu QA cần thì là
 *    case riêng.
 * 6. Thời gian chạy: setup tạo 4 thư mục + 5 tài liệu, mỗi lần tạo đều mở lại BHS (~37 s) nên riêng
 *    phần dựng dữ liệu đã khá lâu; `timeout` toàn cục của dự án là **30 phút/test**
 *    (`playwright.config.ts`). Nếu chạm ngưỡng, cân nhắc `openModalThemThuMuc({ moLaiBoHoSo: false })`
 *    (⚠️ tối ưu này **chưa được kiểm chứng trên môi trường thật** — `MODAL-TAO-THU-MUC.md` mục 1).
 */

const runTest = async (
  adminPage: Page,
  ecm05Page: Page,
  ecm07Page: Page,
  ecm06Page: Page,
  ecm08Page: Page,
) => {
  // --- Thao tác 1 + 2: dựng BHS + 4 thư mục + 1 tài liệu ở gốc, mỗi thư mục 1 tài liệu, rồi
  //     chuyển Hoạt động ---
  const duLieu = await dungDuLieuXoaThuMuc(adminPage, {
    maCase: "618",
    soThuMuc: 4,
    quyenBoHoSo: { permTestId: DOC_PERM.OWNER, account: "ecm05" },
    quyenThuMuc: [
      { thuMucSo: 3, permTestId: FOLDER_PICKER.OWNER, account: "ecm07" },
      { thuMucSo: 4, permTestId: FOLDER_PICKER.OWNER, account: GROUP.ECM06 },
    ],
    taiLieuGoc: { permTestId: DOC_PERM.OWNER, account: "ecm08" },
    chuyenSangHoatDong: true,
  });

  const [tm1, tm2, tm3, tm4] = duLieu.thuMuc;
  const tenTaiLieuGoc = duLieu.tenTaiLieuGoc;
  if (!tenTaiLieuGoc) {
    throw new Error(
      "Lỗi dựng dữ liệu: không có tài liệu ở gốc BHS — kiểm tra lại `taiLieuGoc` của `dungDuLieuXoaThuMuc`",
    );
  }

  // --- Thao tác 3: mỗi vai xoá 1 tài liệu ---
  await xoaTaiLieuTrongCauTruc(
    adminPage,
    duLieu,
    tm1.tenTaiLieu,
    "admin (người tạo BHS)",
    { tenThuMucChua: tm1.tenThuMuc },
  );
  await xoaTaiLieuTrongCauTruc(
    ecm05Page,
    duLieu,
    tm2.tenTaiLieu,
    "ecm05 (Owner BHS)",
    { tenThuMucChua: tm2.tenThuMuc },
  );
  await xoaTaiLieuTrongCauTruc(
    ecm07Page,
    duLieu,
    tm3.tenTaiLieu,
    `ecm07 (Owner thư mục "${tm3.tenThuMuc}")`,
    { tenThuMucChua: tm3.tenThuMuc },
  );
  await xoaTaiLieuTrongCauTruc(
    ecm06Page,
    duLieu,
    tm4.tenTaiLieu,
    `ecm06 (thành viên nhóm ${GROUP.ECM06} — Owner thư mục "${tm4.tenThuMuc}")`,
    { tenThuMucChua: tm4.tenThuMuc },
  );
  await xoaTaiLieuTrongCauTruc(
    ecm08Page,
    duLieu,
    tenTaiLieuGoc,
    `ecm08 (Owner tài liệu "${tenTaiLieuGoc}")`,
  );

  // --- Kiểm chứng cuối bằng phiên người tạo BHS: mất hết 5 tài liệu, 4 thư mục còn nguyên ---
  await expectDaXoaTaiLieu(adminPage, duLieu, {
    canMatHet: [...duLieu.thuMuc.map((tm) => tm.tenTaiLieu), tenTaiLieuGoc],
    canConLai: duLieu.thuMuc.map((tm) => tm.tenThuMuc),
  });
};

test(
  "UC?? 1.4.7.618 - Xóa 1 Tài liệu trong cấu trúc hồ sơ (admin, Owner BHS, Owner thư mục, Nhóm Owner thư mục, Owner tài liệu) - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm05, ecm07, ecm06, ecm08 }) => {
    await runTest(admin, ecm05, ecm07, ecm06, ecm08);
  },
);
