import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createThuMuc,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { expectItemChuaItemCon, nhanBanThuMucVaXacNhan } from "./1.4.9.steps";

/**
 * UC?? — 1.4.9.710
 * **Kiểm tra Nhân bản Thư mục thành công**
 *
 * Thao tác (nguyên văn):
 * 1. Tạo 1 bộ hồ sơ mới.
 * 2. Tạo thư mục 1. Bên trong thư mục 1 tạo thêm thư mục 2.
 * 3. Chọn vào thư mục 1 chọn chức năng nhân bản, nhân bản hoàn thành sẽ hiện notice
 *    "Nhân bản hoàn thành", sau đó sẽ hiện thị màn hình cập nhật cho thư mục được nhân bản, cần
 *    kiểm tra tên thư mục được copy là "Copy of " + <tên gốc>, sau đó xác nhận là được. Kiểm tra
 *    bên trong thư mục 1 cũng có chứa thư mục 2 (tên như 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.9.md`](./1.4.9.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
 *
 * - **BHS + cây 2 cấp dựng thẳng trong case** (không tách file setup — mỗi case của mục dựng một cây
 *   khác nhau): đúng thao tác 1–2 của QA. Thư mục 2 nằm trong thư mục 1 là **tiền đề bắt buộc** —
 *   không có item con thì không kiểm được "nhân bản có mang theo cây con hay không", tức mất nửa kỳ
 *   vọng của case.
 * - **Giữ nguyên trạng thái "Khai báo"**: vai thao tác chính là người tạo BHS nên vẫn mở lại được
 *   (`PHAN-QUYEN-THEO-VAI.md` mục 1); QA cũng không nêu bước chuyển hoạt động.
 * - **Kỳ vọng đo ở 3 mốc**, đúng thứ tự QA mô tả:
 *   1. **toast `"Nhân bản hoàn thành"`** — rình từ **trước** khi bấm "Nhân bản" (`rinhToast` bên
 *      trong `nhanBanThuMuc`), vì sau click còn phải chờ màn cập nhật render mà toast chỉ sống ~3 s
 *      (`KHO-TAI-LIEU.md` mục 9.8);
 *   2. **màn cập nhật của bản sao hiện lên** và ô "Tên" = `"Copy of " + <tên gốc>` — assert
 *      **trước khi** bấm Xác nhận, vì đó là giá trị app tự sinh (xem JSDoc `nhanBanThuMucVaXacNhan`);
 *   3. **mở lại BHS** rồi kiểm tra bảng Cấu trúc hồ sơ: bên trong thư mục bản sao có thư mục con
 *      tên **giữ nguyên** (`"...-TM2"`, KHÔNG có tiền tố `"Copy of "`).
 *      Chỉ có toast + tên trên form thì chưa chứng minh dữ liệu đã ghi xuống server.
 * - **Đọc QA "kiểm tra bên trong thư mục 1 cũng có chứa thư mục 2"**: hiểu là **thư mục 1 bản sao**
 *   — kiểm tra bản gốc còn nguyên con của nó là chuyện hiển nhiên, còn cụm "(tên như cũ)" chỉ có
 *   nghĩa khi nói về bản sao (con **không** bị đổi thành `"Copy of ..."` như cha).
 *   Case vẫn assert **cả hai**: bản sao có con, **và** bản gốc vẫn còn con — mốc thứ 2 bắt được lỗi
 *   app **chuyển** (thay vì sao chép) cây con sang bản sao, mà chỉ nhìn bản sao thì không thấy.
 * - **Xác định "bên trong"** bằng **mã prefix**, không bằng tên: tên bản sao chứa nguyên tên gốc nên
 *   mọi cách lọc dòng theo chuỗi con đều dính nhầm (`expectItemChuaItemCon`).
 * - **Không kiểm tra** các thuộc tính khác của bản sao (độ mật, trạng thái hiển thị, phân quyền, mã
 *   prefix mới được cấp là gì) — QA không nêu; đó là **case riêng**, chưa viết.
 * - **2 test (Thủ thư + Admin)** theo quy ước `tests/README.md` mục 6.4; QA không nêu vai cụ thể nên
 *   chạy 2 vai mặc định, mỗi vai tự dựng BHS riêng để chạy song song được.
 *
 * ## Điểm cần QA/DEV chốt
 *
 * 1. 🚨 **Chức năng "Nhân bản" chưa được khảo sát bằng MCP** (case viết theo yêu cầu "không dùng MCP
 *    khảo sát màn hình", 2026-08-14). Chỉ mốc đầu là testId thật đã khảo sát: mục `mni-nhan-ban`
 *    trong menu hành động của dòng thư mục (`KHO-TAI-LIEU.md` mục 4.4). Ba thứ còn lại — **nội dung
 *    toast**, **việc app mở màn cập nhật của bản sao**, **tiền tố `"Copy of "`** — đều theo mô tả
 *    của QA. Màn cập nhật được bám bằng `getThuMucModal` (lọc modal có tab "Phân quyền") + testId
 *    `txt-ten-thu-muc`, tức **giả định nó dùng chung bố cục với modal "Cập nhật thư mục"**
 *    (`MODAL-TAO-THU-MUC.md` mục 6b). Chạy thật hỏng ở bước nào → khảo sát lại bằng
 *    `/khao-sat-man-hinh`, đừng vá thêm selector đoán.
 * 2. **Chưa rõ app có hỏi xác nhận trước khi nhân bản hay không** (kiểu dialog "Bạn có chắc chắn…").
 *    Script đang giả định bấm `mni-nhan-ban` là chạy luôn. Có dialog chen vào thì bước chờ màn cập
 *    nhật sẽ timeout — khi đó bổ sung bước xác nhận vào `nhanBanThuMuc`.
 *    Tương tự, bước bấm "Xác nhận" ở màn cập nhật bản sao đang dùng `luuModalThuMuc` nên **chờ toast
 *    `"Thành công"`** như mọi lần lưu modal thư mục; app dùng toast khác (hoặc không bắn toast vì
 *    bản sao đã được ghi từ lúc nhân bản) thì sửa lại bước này, đừng bỏ assert.
 * 3. **Chưa rõ tiền tố `"Copy of "` có phụ thuộc ngôn ngữ giao diện hay không** (app có mục "Ngôn
 *    ngữ / Tiếng Việt" ở dropdown user — `KHO-TAI-LIEU.md` mục 9.10). Đang hard-code trong hằng
 *    `PREFIX_BAN_SAO`; nếu bản tiếng Việt dùng chuỗi khác thì sửa đúng 1 chỗ đó.
 * 4. **Chưa rõ app xử lý thế nào khi nhân bản lần 2** (tên `"Copy of Copy of ..."` hay đánh số) —
 *    case này chỉ nhân bản **1 lần**; muốn kiểm thì viết **case riêng**.
 * 5. Case **không** kiểm tra tài liệu/file bên trong thư mục có được nhân bản theo hay không: cây
 *    tiền điều kiện chỉ gồm thư mục (QA mô tả vậy). Trường hợp thư mục chứa **tài liệu** là case
 *    [`1.4.9.720`](./1.4.9.720.spec.ts).
 */

const runTest = async (page: Page) => {
  const pw = new PW(page);
  const base = `AT-1.4.9-710-${Date.now()}`;
  // ⚠️ Không tên nào được là tiền tố của tên kia (`getCauTrucRow` khớp chuỗi con) — xem `1.4.9.md`
  const tenThuMuc1 = `${base}-TM1`;
  const tenThuMuc2 = `${base}-TM2`;

  // --- Thao tác 1: tạo 1 bộ hồ sơ mới ---
  const recordUrl = await createBoHoSo(page, pw, base);

  // --- Thao tác 2: thư mục 1 ở gốc BHS, bên trong có thư mục 2 ---
  await createThuMuc(page, pw, recordUrl, tenThuMuc1);
  await createThuMuc(page, pw, recordUrl, tenThuMuc2, {
    parentName: tenThuMuc1,
  });

  // --- Thao tác 3: nhân bản thư mục 1 → toast + màn cập nhật + tên "Copy of ..." + Xác nhận ---
  const tenBanSao = await nhanBanThuMucVaXacNhan(page, recordUrl, tenThuMuc1);

  // --- Mong muốn: bản sao chứa thư mục 2 với tên giữ nguyên ---
  await expectItemChuaItemCon(page, recordUrl, tenBanSao, tenThuMuc2);

  // --- Mong muốn (bổ sung): bản gốc vẫn còn thư mục 2 — nhân bản là SAO CHÉP, không phải CHUYỂN ---
  await expectItemChuaItemCon(page, recordUrl, tenThuMuc1, tenThuMuc2);
};

test(
  "UC?? 1.4.9.710 - Nhân bản Thư mục thành công - Thủ thư" + ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTest(librarian);
  },
);

test(
  "UC?? 1.4.9.710 - Nhân bản Thư mục thành công - Admin" + ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
