import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createTaiLieu,
  createThuMuc,
  chuyenHoatDong,
} 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.5 — Cập nhật tài liệu trong
 * Cấu trúc hồ sơ**.
 *
 * ⚠️ Mã UC của mục chưa được QA chốt → prefix dữ liệu tạm là `AT-1.4.5-...`
 * (đổi khi chốt được UC — xem `tests/1.4.5/1.4.5.md`).
 *
 * Đọc `tests/1.4.5/1.4.5.md` trước khi sửa file này.
 */

export type DungDuLieuCapNhatTaiLieuOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"529"` → `AT-1.4.5-529-<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 };
  /**
   * Cấp quyền **chỉ tại thư mục** (`permTestId` dùng hằng `FOLDER_PICKER`): tạo thêm 1 thư mục
   * ở gốc BHS, **đặt quyền độc lập** rồi cấp quyền cho vai đó, và **tài liệu được tạo bên trong
   * thư mục này** → dựng tiền điều kiện "vai chỉ có quyền tại 1 thư mục".
   *
   * Không truyền → tài liệu nằm ở **gốc BHS** và kế thừa quyền của BHS.
   */
  quyenThuMuc?: { permTestId: string; account: string };
  /** Chuyển BHS sang "Hoạt động" — bắt buộc khi vai cần test không phải người tạo BHS */
  chuyenSangHoatDong?: boolean;
};

export type DuLieuCapNhatTaiLieu = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS (và để mở lại tài liệu) */
  recordUrl: string;
  /** Tên BHS */
  tenBoHoSo: string;
  /** Thư mục chứa tài liệu; **rỗng** = tài liệu nằm ở gốc BHS */
  tenThuMuc: string;
  /** Tài liệu đã tạo sẵn — đối tượng bị cập nhật của các case trong mục */
  tenTaiLieu: string;
  /**
   * Tên mới dùng cho bước đổi tên (setup **chỉ sinh tên**, việc sửa là Thao tác của case).
   *
   * ⚠️ Không đặt kiểu `<tenTaiLieu>-DOI-TEN`: các hàm tìm dòng / tìm item theo tên khớp theo
   * **chuỗi con** nên tên cũ là tiền tố của tên mới sẽ khớp cả 2 dòng.
   */
  tenTaiLieuMoi: string;
};

/**
 * Cấu trúc dữ liệu dựng ra:
 *
 *     BHS  (Owner = `page` đang đăng nhập; + `quyenBoHoSo` nếu có)
 *      ├─ tenTaiLieu                      ← khi KHÔNG có `quyenThuMuc` (tài liệu ở gốc BHS)
 *      └─ tenThuMuc                       ← khi CÓ `quyenThuMuc`: thư mục quyền ĐỘC LẬP
 *           └─ tenTaiLieu                   + tài liệu nằm bên trong thư mục đó
 */
export const dungDuLieuCapNhatTaiLieu = async (
  page: Page,
  opts: DungDuLieuCapNhatTaiLieuOptions,
): Promise<DuLieuCapNhatTaiLieu> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-1.4.5-${opts.maCase}-${ts}`;
  const duLieu: DuLieuCapNhatTaiLieu = {
    recordUrl: "",
    tenBoHoSo: goc,
    tenThuMuc: opts.quyenThuMuc ? `${goc}-TM` : "",
    tenTaiLieu: `${goc}-TL-CU`,
    tenTaiLieuMoi: `${goc}-TL-MOI`,
  };

  const moTaQuyenBHS = opts.quyenBoHoSo
    ? ` (cấp ${opts.quyenBoHoSo.permTestId} cho "${opts.quyenBoHoSo.account}")`
    : "";
  const moTaViTri = opts.quyenThuMuc
    ? ` + thư mục "${duLieu.tenThuMuc}" quyền độc lập (cấp ${opts.quyenThuMuc.permTestId} cho "${opts.quyenThuMuc.account}") chứa tài liệu "${duLieu.tenTaiLieu}"`
    : ` + tài liệu "${duLieu.tenTaiLieu}" ở gốc BHS`;

  await test.step(`Tiền điều kiện: tạo BHS "${goc}"${moTaQuyenBHS}${moTaViTri}`, 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): tạo tài liệu
    // xong `page.url()` bị thay bằng URL của tài liệu vừa tạo
    duLieu.recordUrl = await createBoHoSo(page, pw, goc, {
      peoplePickers: opts.quyenBoHoSo
        ? [
            {
              testId: opts.quyenBoHoSo.permTestId,
              account: opts.quyenBoHoSo.account,
            },
          ]
        : undefined,
    });

    if (opts.quyenThuMuc) {
      await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc, {
        quyenDocLap: true,
        perm: {
          account: opts.quyenThuMuc.account,
          permTestId: opts.quyenThuMuc.permTestId,
        },
      });
    }

    await createTaiLieu(page, pw, duLieu.recordUrl, duLieu.tenTaiLieu, {
      folderName: duLieu.tenThuMuc || undefined,
    });

    if (opts.chuyenSangHoatDong) {
      await chuyenHoatDong(page, duLieu.recordUrl);
    }
  });

  return duLieu;
};
