import fs from "fs";
import os from "os";
import path from "path";
import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createThuMuc,
  DOC_PERM,
  FOLDER_PICKER,
  sampleFile,
  SAMPLE_FILE,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";

/**
 * Dựng dữ liệu tiền điều kiện dùng chung cho bộ case **1.4.2 — Thêm mới tài liệu trong
 * Cấu trúc hồ sơ** (UC23).
 *
 * Đọc `tests/1.4.2/1.4.2.md` trước khi sửa file này.
 */

export type DungDuLieuTaiLieuOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"261"` → `AT-UC23-261-<ts>` */
  maCase: string;
  /**
   * Cấp quyền cho 1 người dùng / nhóm **ngay khi tạo BHS** — dùng khi vai cần test không phải
   * người tạo BHS. Thư mục / tài liệu bên trong sẽ kế thừa quyền này.
   */
  quyenBoHoSo?: { permTestId: string; account: string };
  /**
   * Tạo sẵn 1 thư mục ở gốc BHS (mặc định **có**). Truyền `quyenThuMuc` để thư mục đó
   * **đặt quyền độc lập** rồi cấp quyền cho 1 vai → dựng tiền điều kiện
   * "vai chỉ có quyền tại 1 thư mục" (vai đó không có quyền tương ứng ở BHS).
   */
  taoThuMuc?: boolean;
  /** Quyền cấp riêng tại thư mục (`permTestId` dùng hằng `FOLDER_PICKER`) */
  quyenThuMuc?: { permTestId: string; account: string };
};

export type DuLieuTaiLieu = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS */
  recordUrl: string;
  /** Tên BHS */
  tenBoHoSo: string;
  /** Thư mục ở gốc BHS (chỉ có khi `taoThuMuc !== false`) */
  tenThuMuc1: string;
  /**
   * Tên 4 tài liệu case sẽ tạo ở bước **Thao tác** (setup chỉ đặt tên, không tạo):
   * `1` trong thư mục 1, `2` ở gốc BHS, `3`/`4` do các vai khác tạo.
   */
  tenTaiLieu1: string;
  tenTaiLieu2: string;
  tenTaiLieu3: string;
  tenTaiLieu4: string;
};

/**
 * Cấu trúc dữ liệu dựng ra:
 *
 *     BHS  (Owner = `page` đang đăng nhập; + `quyenBoHoSo` nếu có)
 *      └─ tenThuMuc1   ← quyền ĐỘC LẬP + cấp quyền cho 1 vai (khi có `quyenThuMuc`),
 *                        ngược lại vẫn KẾ THỪA quyền của BHS
 *
 * Việc **tạo tài liệu** là phần Thao tác của case nên không dựng ở đây — setup chỉ sinh sẵn tên
 * (`tenTaiLieu1`…`tenTaiLieu4`) để mọi bước dùng chung một bộ tên.
 *
 * ⚠️ Tên thư mục / tài liệu đặt hậu tố khác nhau (`-TM1`, `-TL1`…) và **không** để tên nào là
 * tiền tố của tên khác: các hàm tìm dòng theo tên (`getCauTrucRow`, `getCodeCuaItemPhanQuyen`)
 * khớp theo **chuỗi con**.
 */
export const dungDuLieuTaiLieu = async (
  page: Page,
  opts: DungDuLieuTaiLieuOptions,
): Promise<DuLieuTaiLieu> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-UC23-${opts.maCase}-${ts}`;
  const duLieu: DuLieuTaiLieu = {
    recordUrl: "",
    tenBoHoSo: goc,
    tenThuMuc1: `${goc}-TM1`,
    tenTaiLieu1: `${goc}-TL1`,
    tenTaiLieu2: `${goc}-TL2`,
    tenTaiLieu3: `${goc}-TL3`,
    tenTaiLieu4: `${goc}-TL4`,
  };

  const taoThuMuc = opts.taoThuMuc ?? true;
  const moTaQuyenBHS = opts.quyenBoHoSo
    ? ` (cấp ${opts.quyenBoHoSo.permTestId} cho "${opts.quyenBoHoSo.account}")`
    : "";
  const moTaThuMuc = !taoThuMuc
    ? ""
    : opts.quyenThuMuc
      ? ` + thư mục "${duLieu.tenThuMuc1}" quyền độc lập, cấp ${opts.quyenThuMuc.permTestId} cho "${opts.quyenThuMuc.account}"`
      : ` + thư mục "${duLieu.tenThuMuc1}" (kế thừa quyền BHS)`;

  await test.step(`Tiền điều kiện: tạo BHS "${goc}"${moTaQuyenBHS}${moTaThuMuc}`, async () => {
    // recordUrl phải lưu TRƯỚC khi tạo thư mục/tài liệu (KHO-TAI-LIEU.md mục 9.3)
    duLieu.recordUrl = await createBoHoSo(page, pw, goc, {
      peoplePickers: opts.quyenBoHoSo
        ? [
            {
              testId: opts.quyenBoHoSo.permTestId,
              account: opts.quyenBoHoSo.account,
            },
          ]
        : undefined,
    });

    if (taoThuMuc) {
      await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc1, {
        quyenDocLap: !!opts.quyenThuMuc,
        perm: opts.quyenThuMuc
          ? {
              account: opts.quyenThuMuc.account,
              permTestId: opts.quyenThuMuc.permTestId,
            }
          : undefined,
      });
    }
  });

  return duLieu;
};

/* -------------------------------------------------------------------------- */
/* File upload cho các case "Tài liệu số"                                      */
/* -------------------------------------------------------------------------- */

/**
 * Tạo 1 **bản PDF nội dung độc nhất** (copy từ `src/sample-files/file-sample.pdf` + chèn thêm 1
 * dòng comment PDF chứa timestamp) và trả về đường dẫn file tạm.
 *
 * 🚨 Vì sao cần: app **kiểm trùng file mềm theo nội dung** trên toàn hệ thống — upload lại đúng 1
 * file mẫu sẽ bật dialog *"Danh sách tài liệu trùng"*
 * (`KHO-TAI-LIEU.TAB-TAI-LIEU-SO.md` mục 5). Case nào cần **upload lần đầu / file chưa từng có**
 * thì phải dùng file do hàm này sinh ra, không dùng thẳng `sampleFile(...)`.
 *
 * Nội dung thêm nằm **sau `%%EOF`** nên file vẫn là PDF hợp lệ; đuôi giữ nguyên `.pdf` để thoả
 * `accept` của uploader.
 */
export const taoFilePdfDuyNhat = (maCase: string): string => {
  const gocPdf = fs.readFileSync(sampleFile(SAMPLE_FILE.PDF));
  const ts = Date.now();
  const thuMuc = fs.mkdtempSync(path.join(os.tmpdir(), `at-uc23-${maCase}-`));
  const duongDan = path.join(thuMuc, `AT-UC23-${maCase}-${ts}.pdf`);
  fs.writeFileSync(
    duongDan,
    Buffer.concat([gocPdf, Buffer.from(`\n%% AT-UC23-${maCase}-${ts}\n`)]),
  );
  return duongDan;
};

/**
 * Tiền điều kiện của **case 261** (thao tác 1–2 phần dựng dữ liệu):
 * BHS mới do `page` tạo, **Owner cho `ecm05`** + 1 thư mục có **quyền độc lập, Owner cho `ecm06`**.
 */
export const dungDuLieu261 = (
  page: Page,
  maCase: string,
): Promise<DuLieuTaiLieu> =>
  dungDuLieuTaiLieu(page, {
    maCase,
    quyenBoHoSo: { permTestId: DOC_PERM.OWNER, account: "ecm05" },
    quyenThuMuc: { permTestId: FOLDER_PICKER.OWNER, account: "ecm06" },
  });
