import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import { layTenHienThiNguoiDangDangNhap } from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuTaiLieu, taoFilePdfDuyNhat } from "./1.4.2.setup";
import {
  expectFileConSauKhiMoLai,
  expectFileHienThiTrongBang,
  taoTaiLieuDuTruongBatBuoc,
  uploadFileLanDau,
} from "./1.4.2.steps";

/**
 * UC23 — 1.4.2.397
 * **Kiểm tra upload lần đầu với 1 file định dạng bất kỳ thỏa mãn điều kiện cho phép**
 *
 * Thao tác (nguyên văn):
 * 1. Dùng admin tạo 1 bộ hồ sơ mới.
 * 2. Tạo 1 tài liệu mới, sau đó upload 1 file pdf lên
 * 3. Có hiển thị upload thành công và hiển thị file PDF là thành công
 *
 * **Tiền điều kiện chung của mục**: [`1.4.2.md`](./1.4.2.md). Logic/kỳ vọng của case nằm ở đây.
 *
 * ---
 *
 * ## Cách case này được viết
 *
 * - **File upload là bản PDF nội dung ĐỘC NHẤT sinh lúc chạy** (`taoFilePdfDuyNhat`), không dùng
 *   thẳng `src/sample-files/file-sample.pdf`. Lý do: app **kiểm trùng file mềm theo nội dung trên
 *   toàn hệ thống**, file mẫu đã từng được upload nên sẽ bật dialog *"Danh sách tài liệu trùng"* →
 *   không còn là "upload **lần đầu**" như QA yêu cầu (xem `KHO-TAI-LIEU.TAB-TAI-LIEU-SO.md` mục 5).
 *   File sinh ra = file mẫu + 1 dòng comment PDF sau `%%EOF` nên vẫn là PDF hợp lệ, đuôi `.pdf`
 *   thoả `accept` của uploader.
 * - "Upload **lần đầu**" được kiểm chứng 2 lớp: (a) trước khi upload, bảng phải đang ở trạng thái
 *   rỗng `empty-file-dinh-kem`; (b) `uploadFileTaiLieu(..., { expectKhongTrung: true })` → dialog
 *   trùng xuất hiện là **fail** kèm thông báo liệt kê bảng `tbl-file-trung`.
 * - **"Hiển thị upload thành công"**: assert cứng theo **dòng file trong bảng** + Dung lượng /
 *   Thời gian upload không rỗng + Người upload = admin. Toast `"Tải tài liệu lên thành công."` chỉ
 *   được chờ **kiểu mềm** bên trong `uploadFileTaiLieu` — đã đo được trường hợp upload thành công
 *   (log app đủ `azure-put` + `save-metadata`) mà toast **không bắt được** vì nó sống ~4 s và app tự
 *   mở modal xem trước file ngay sau đó (`KHO-TAI-LIEU.TAB-TAI-LIEU-SO.md` mục 6). Nếu QA bắt buộc
 *   phải assert toast thì đây là điểm cần chốt lại với DEV (toast nên sống lâu hơn / có testId).
 * - Thêm 1 bước ngoài yêu cầu QA: **mở lại tài liệu** rồi kiểm tra file vẫn còn — để phân biệt "đã
 *   lưu" với "chỉ hiện tạm trên UI".
 * - **1 test (Admin)** theo đúng nguyên văn "dùng admin"; BHS giữ nguyên trạng thái `Khai báo`
 *   (người tạo BHS thao tác nên không cần `chuyenHoatDong`). Muốn chạy thêm bằng Thủ thư: đăng ký
 *   thêm 1 `test(...)` gọi `runTest(librarian)`.
 *
 * ## Điểm cần QA/DEV chốt
 *
 * 1. QA viết "1 file định dạng bất kỳ thỏa mãn điều kiện cho phép" — `accept` thật của uploader là
 *    `.docx,.xlsx,.png,.jpg,.txt,.jpeg,.pptx,.rar,.zip,.cad,.mp3,.mp4,.mkv,.mov,.m4a,.pdf`
 *    (**không có `.doc`, `.xls`**). Case này chỉ phủ `.pdf` theo đúng thao tác QA ghi; muốn phủ hết
 *    định dạng thì nên là case riêng.
 * 2. Hành vi **file trùng nội dung** (dialog `tbl-file-trung`) chưa thấy trong bộ testcase QA gửi —
 *    nếu QA muốn kiểm chứng thì cần case riêng cho nhánh này (đã có sẵn `LUA_CHON_TRUNG` để dùng).
 */

const runTest = async (nguoiTao: Page) => {
  const tenNguoiTao = await layTenHienThiNguoiDangDangNhap(nguoiTao);

  // --- Thao tác 1: tạo BHS mới (không cần thư mục) ---
  const duLieu = await dungDuLieuTaiLieu(nguoiTao, {
    maCase: "397",
    taoThuMuc: false,
  });

  // --- Thao tác 2: tạo tài liệu mới rồi upload 1 file PDF ---
  const tl = await taoTaiLieuDuTruongBatBuoc(
    nguoiTao,
    duLieu.recordUrl,
    duLieu.tenTaiLieu1,
  );
  const tenTep = await uploadFileLanDau(
    nguoiTao,
    duLieu.recordUrl,
    tl,
    taoFilePdfDuyNhat("397"),
  );

  // --- Thao tác 3: upload thành công + file PDF hiển thị ---
  await expectFileHienThiTrongBang(nguoiTao, tenTep, tenNguoiTao);
  await expectFileConSauKhiMoLai(nguoiTao, duLieu.recordUrl, tl, tenTep);
};

test(
  "UC23 1.4.2.397 - Upload lần đầu 1 file PDF hợp lệ vào tài liệu mới - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
