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 {
  xoaThuMucCoTaiLieuBenTrong,
  expectDaXoaHetThuMucVaTaiLieu,
} from "./1.4.7.steps";

/**
 * UC?? — 1.4.7.616
 * **Kiểm tra chức năng xóa 1 Thư mục có tài liệu bên trong**
 *
 * 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 4 folder,
 *    folder thứ 3 phân quyền owner cho ecm07, folder thứ 4 phân quyền owner cho AUTO_GROUP_ECM06
 * 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ơ
 *    NOTE: khi xoá thư mục có tài liệu bên trong, sẽ hiện 1 modal mới, `ant-modal-confirm-content`
 *    phải là "Thao tác này sẽ xóa tất cả dữ liệu Thư mục/Tài liệu bên trong! Bạn có chắc chắn thực
 *    hiện Xóa?" (nếu text không đúng thì cảnh báo và vẫn thực hiện xóa tiếp). Sau đó bấm xác nhận
 *    xóa, testid = "btn-xoa-xac-nhan" thì cần xóa được cả thư mục và tài liệu bên trong.
 * 3. Dùng admin xóa thư mục 1, ecm05 xóa thư mục 2, ecm07 xóa thư mục 3, ecm06 xóa thư mục 4
 *
 * **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
 *
 * - **1 test duy nhất, 4 vai thao tác trên cùng 1 BHS**: 4 lần xoá là 4 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**). Tách thành
 *   4 test sẽ phải dựng lại BHS + 4 thư mục + 4 tài liệu 4 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 4 test, mỗi test gọi `dungDuLieuXoaThuMuc` với `soThuMuc: 1`.
 * - **Thứ tự xoá đúng theo QA**: TM1 (admin) → TM2 (`ecm05`) → TM3 (`ecm07`) → TM4 (`ecm06`).
 *   Các thư mục độc lập nhau nên thứ tự không ảnh hưởng kết quả, nhưng vẫn giữ để khớp mô tả.
 * - **Quyền của từng vai được dựng ở đúng cấp mà QA nêu**:
 *   - `ecm05`: Owner **cấp BHS** — gán ở người-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 TM2 qua kế thừa.
 *   - `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". Cấp quyền trực tiếp lên 1 thư mục **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 → admin và `ecm05` vẫn giữ quyền tại đó
 *     (`MODAL-TAO-THU-MUC.md` mục 4b). 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**: 3 trong 4 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.
 * - **Nội dung dialog cảnh báo là `expect.soft`**: theo yêu cầu, text sai thì **cảnh báo** nhưng vẫn
 *   bấm xác nhận để đo được phần quan trọng hơn (xoá lan xuống tài liệu bên trong). Test vẫn **fail**
 *   ở cuối nếu text lệch — soft assert không làm mất kết quả kiểm tra text.
 * - **Kỳ vọng "xoá được cả thư mục và tài liệu bên trong" đ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 `xoaThuMucCoTaiLieuBenTrong`) và **một lần cuối
 *   bằng phiên admin** (`expectDaXoaHetThuMucVaTaiLieu`). 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. **Chưa khảo sát bằng MCP** dialog xoá thư mục có dữ liệu bên trong: nội dung
 *    `.ant-modal-confirm-content` và testId `btn-xoa-xac-nhan` đều **do người dùng cung cấp**
 *    (2026-08-05). Nếu app dùng testId khác, `xoaItemCauTruc` sẽ soft-fail rồi rơi về nút theo nhãn
 *    `"Xác nhận"` — xoá vẫn chạy, và cần cập nhật `KHO-TAI-LIEU.md` mục 4.4 theo DOM thật.
 * 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 — mục "Chưa khảo sát"). Tiền điều kiện QA khẳng định Owner của
 *    thư mục xoá được thư mục đó, nên case viết thẳng theo mô tả; nếu `ecm07` / `ecm06` **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**: thư mục/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á (thư mục và 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. Thời gian chạy: setup tạo 4 thư mục + 4 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,
) => {
  // --- Thao tác 1 + 2: dựng BHS + 4 thư mục (mỗi thư mục 1 tài liệu) rồi chuyển Hoạt động ---
  const duLieu = await dungDuLieuXoaThuMuc(adminPage, {
    maCase: "616",
    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 },
    ],
    chuyenSangHoatDong: true,
  });

  const [tm1, tm2, tm3, tm4] = duLieu.thuMuc;

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

  // --- Kiểm chứng cuối bằng phiên người tạo BHS: không còn thư mục / tài liệu nào ---
  await expectDaXoaHetThuMucVaTaiLieu(adminPage, duLieu);
};

test(
  "UC?? 1.4.7.616 - Xóa 1 Thư mục có tài liệu bên trong (admin, Owner BHS, Owner thư mục, Nhóm Owner thư mục) - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm05, ecm07, ecm06 }) => {
    await runTest(admin, ecm05, ecm07, ecm06);
  },
);
