import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import {
  TEMPLATE_FILE,
  templateFile,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungBoHoSoNhapExcel } from "./1.4.8.setup";
import {
  docCauTrucTuTemplate,
  expectBoHoSoConRong,
  expectCoThemThuMucMoi,
  nhapExcelVaoBoHoSo,
} from "./1.4.8.steps";

/**
 * UC?? — 1.4.8.664
 * **Kiểm tra nút Cập nhật thành công khi toàn bộ dữ liệu hợp lệ** (nhập cấu trúc hồ sơ từ file Excel)
 *
 * Thao tác (nguyên văn):
 * 1. Tạo 1 bộ hồ sơ mới.
 * 2. Bấm vào menu thêm, chọn "Nhập excel", sử dụng file `src/template-files/template3A.xlsx`
 *    để nhập vào.
 * 3. Click Tiếp theo, click Cập nhật, đợi hiện thông báo "Tạo mới thành công" và quan sát thấy có
 *    thư mục, tài liệu mới được tạo là thành công.
 *
 * **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.8.md`](./1.4.8.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 mới, rỗng, do chính vai thao tác tạo**: thao tác 1 của QA. BHS rỗng là điều kiện để kết
 *   luận mọi thư mục/tài liệu thấy ở bước cuối đều **do nhập excel sinh ra** — vì vậy trước khi nhập
 *   có thêm 1 assert "bảng Cấu trúc hồ sơ đang trống" (`expectBoHoSoConRong`). Không assert bước này
 *   thì một BHS lỡ có sẵn dữ liệu vẫn cho test pass.
 * - **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 ở 2 mốc**, đúng như QA mô tả:
 *   1. toast **"Tạo mới thành công"** ngay sau khi bấm "Cập nhật" (assert trong `nhapCauTrucTuExcel`,
 *      chờ tới 60 s vì app phải ghi cả cây thư mục/tài liệu);
 *   2. **mở lại BHS** rồi kiểm tra bảng Cấu trúc hồ sơ **có thư mục mới**
 *      (`expectCoThemThuMucMoi`). Chỉ có toast thì chưa chứng minh dữ liệu đã ghi xuống server.
 * - 🚨 **KHÔNG đòi bảng khớp đủ mọi dòng của file Excel** (chốt với người dùng 2026-08-14): file mẫu
 *   có thể chứa **dòng lỗi cố ý** (dùng cho các case kiểm tra lỗi), nên app bỏ qua vài dòng vẫn là
 *   đúng. Kỳ vọng cứng chỉ gồm: bảng có ≥ 1 dòng **và** có ≥ 1 **thư mục** của file (so theo tên).
 * - 🚨 **Tài liệu: chỉ ghi log, không assert** — người dùng đính chính 2026-08-14 rằng template đang
 *   dùng *"chỉ có thư mục, không có tài liệu/file"*. ⚠️ Đọc lại `template3A.xlsx` thì cột `type`
 *   **vẫn có 11 dòng `Tài liệu`** (`A.1.1`, `A.1.2.1`… `A.3.1`, có số hiệu + loại tài liệu "Báo
 *   cáo") → 2 khả năng, **cần chốt**: (a) app bỏ qua các dòng đó khi nhập, hoặc (b) case cần đổi
 *   sang template khác. Trong lúc chưa chốt, script log ra "khớp được N thư mục + M tài liệu" để
 *   nhìn số thật, và **không** fail vì thiếu tài liệu.
 * - **Phải mở rộng cây trước khi đọc dòng** (`moRongToanBoCayCauTruc`): đo trên DOM thật của lần chạy
 *   2026-08-14 10:49, sau khi nhập `template3A.xlsx` bảng **chỉ hiện `A`, `A.1`, `A.2`, `A.3`** —
 *   item cấp sâu hơn không thấy nếu không expand. Cũng vì DOM thật mà bản đầu dùng
 *   **bộ đếm `Thư mục: n` / `Tài liệu: m`** ở header tab đã bị bỏ: build này **không render** bộ đếm đó.
 * - **Vẫn đọc file `.xlsx`** (`docCauTrucTuTemplate`) nhưng **chỉ để ghi log**: báo cáo in ra file
 *   khai báo bao nhiêu item / bảng tạo được bao nhiêu / dòng nào không thấy — đủ để soi khi app nhập
 *   thiếu bất thường, mà không biến "dòng lỗi cố ý" thành test fail.
 * - **Không kiểm tra mã prefix và quan hệ cha–con** có đúng cột `code` của file hay không (mã do app
 *   tự sinh) — đó 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. 🚨 **Modal "Nhập excel" chưa được khảo sát bằng MCP** (case này viết theo yêu cầu "chỉ viết
 *    script, không chạy MCP khảo sát"). Chỉ 2 mốc đầu là testId thật đã khảo sát: `btn-more` của
 *    bảng Cấu trúc hồ sơ và `mni-nhap-tu-excel` (`KHO-TAI-LIEU.md` mục 4.4). Bên trong modal,
 *    `nhapCauTrucTuExcel` bám `input[type="file"]` + **nhãn nút** "Tiếp theo" / "Cập nhật".
 *    Chạy thật mà hỏng ở bước nào → **khảo sát lại bằng `/khao-sat-man-hinh`**, thay bằng testId
 *    thật và bổ sung mô tả modal vào tài liệu màn hình, đừng vá thêm selector đoán.
 * 2. **Chưa khảo sát**: giữa "Tiếp theo" và "Cập nhật" app có thêm bước trung gian nào không
 *    (map cột, chọn thư mục đích, xem trước lỗi dòng…). Script đang giả định đúng 2 lần bấm như QA
 *    mô tả; có bước lạ chen vào thì hàm sẽ báo lỗi kèm **danh sách nút đang có trong modal**.
 *    Riêng modal xác nhận **sau** "Cập nhật" thì script đã lo: có nút **"Tiếp tục"** thì bấm, không
 *    có thì chờ toast như bình thường (`bamTiepTucNeuCo`) — nội dung/testId modal này cũng **chưa
 *    khảo sát**, chỉ khớp theo nhãn nút.
 * 3. ✅ **Đã kiểm chứng trên DOM thật** (trace lần chạy 2026-08-14 10:49): toast là
 *    `.ant-message-notice` > `.ant-message-custom-content.ant-message-success` > `span` với text
 *    **`"Tạo mới thành công!"`** (có dấu `!`); `getToast` lọc theo chuỗi con nên vẫn khớp.
 *    🚨 Việc "mắt thường thấy toast mà Playwright không thấy" đã được xử lý bằng
 *    **`rinhToast`**: bắt đầu chờ toast **trước** khi bấm "Cập nhật", vì toast chỉ sống ~3 s — đúng
 *    bằng `TIMEOUT.CONTROL_LOADING` mà bản cũ chờ cứng sau click (và còn phải bấm thêm modal
 *    "Tiếp tục" ở giữa) nên assert luôn chạy vào lúc toast đã tắt.
 * 4. **Chưa khảo sát**: bảng Cấu trúc hồ sơ phân trang thế nào khi có ~20 item (mặc định
 *    `15 / trang`). `layTenCacDongCauTrucMoiTrang` duyệt `li.ant-pagination-item-<n>` và
 *    `moRongToanBoCayCauTruc` bấm `.ant-table-row-expand-icon-collapsed` — đều là selector AntD
 *    chuẩn, **chưa khảo sát riêng** trên bảng này; nếu app cuộn vô hạn hoặc dùng nút expand khác thì
 *    phần đọc dòng cần sửa lại.
 * 5. Case **không** kiểm tra các thuộc tính khác của tài liệu trong file (số hiệu, ngày, độ mật,
 *    từ khóa…) — bảng Cấu trúc hồ sơ không hiển thị đủ; muốn kiểm thì mở từng tài liệu, thuộc về
 *    **case riêng**. Cũng **không** kết luận app nhập đủ/thiếu bao nhiêu dòng của file: số lượng chỉ
 *    được **ghi log** (xem mục trên), vì template có thể cố ý chứa dòng lỗi.
 * 6. Thời gian chạy: nhập 20 item trong 1 lần bấm nên phần lâu nhất là chờ app ghi + mở lại BHS;
 *    `timeout` toàn cục của dự án là **30 phút/test** (`playwright.config.ts`).
 */

const DUONG_DAN_TEMPLATE = templateFile(TEMPLATE_FILE.CAU_TRUC_3A);

const runTest = async (page: Page) => {
  // Danh sách thư mục/tài liệu mà file excel khai báo — kỳ vọng của bước cuối
  const items = await docCauTrucTuTemplate(DUONG_DAN_TEMPLATE);

  // --- Thao tác 1: tạo 1 bộ hồ sơ mới ---
  const duLieu = await dungBoHoSoNhapExcel(page, { maCase: "664" });

  // Tiền đề: BHS mới còn rỗng (mọi item ở bước cuối đều do nhập excel sinh ra)
  await expectBoHoSoConRong(page, duLieu);

  // --- Thao tác 2 + 3: menu "..." → Nhập excel → chọn file → Tiếp theo → Cập nhật → toast ---
  // `moLaiBoHoSo: false`: BHS đang mở sẵn ở tab "Cấu trúc hồ sơ" sau bước kiểm tra rỗng
  await nhapExcelVaoBoHoSo(page, duLieu, DUONG_DAN_TEMPLATE, {
    moLaiBoHoSo: false,
  });

  // --- Mong muốn: mở lại BHS, thấy có thư mục mới được tạo (tài liệu chỉ ghi log) ---
  await expectCoThemThuMucMoi(page, duLieu, items);
};

test(
  "UC?? 1.4.8.664 - Nhập excel: bấm Cập nhật thành công khi toàn bộ dữ liệu hợp lệ - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTest(librarian);
  },
);

test(
  "UC?? 1.4.8.664 - Nhập excel: bấm Cập nhật thành công khi toàn bộ dữ liệu hợp lệ - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
