import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  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.4 — Cập nhật thư mục 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.4-...`
 * (đổi khi chốt được UC — xem `tests/1.4.4/1.4.4.md`).
 *
 * Đọc `tests/1.4.4/1.4.4.md` trước khi sửa file này.
 */

export type DungDuLieuCapNhatThuMucOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"454"` → `AT-1.4.4-454-<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 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`): thư mục được
   * **đặt quyền độc lập** rồi thêm quyền cho vai đó → dựng tiền điều kiện "vai chỉ có quyền
   * tại 1 thư mục" (không có quyền tương ứng ở 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 DuLieuCapNhatThuMuc = {
  /** 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 đã tạo sẵn ở gốc BHS — đối tượng bị cập nhật của các case trong mục */
  tenThuMuc: 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 `<tenThuMuc>-DOI-TEN`: các hàm tìm dòng 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.
   */
  tenThuMucMoi: string;
};

/**
 * Cấu trúc dữ liệu dựng ra:
 *
 *     BHS  (Owner = `page` đang đăng nhập; + `quyenBoHoSo` nếu có)
 *      └─ tenThuMuc   ← 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
 */
export const dungDuLieuCapNhatThuMuc = async (
  page: Page,
  opts: DungDuLieuCapNhatThuMucOptions,
): Promise<DuLieuCapNhatThuMuc> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-1.4.4-${opts.maCase}-${ts}`;
  const duLieu: DuLieuCapNhatThuMuc = {
    recordUrl: "",
    tenBoHoSo: goc,
    tenThuMuc: `${goc}-TM-CU`,
    tenThuMucMoi: `${goc}-TM-MOI`,
  };

  const moTaQuyenBHS = opts.quyenBoHoSo
    ? ` (cấp ${opts.quyenBoHoSo.permTestId} cho "${opts.quyenBoHoSo.account}")`
    : "";
  const moTaThuMuc = opts.quyenThuMuc
    ? ` + thư mục "${duLieu.tenThuMuc}" quyền độc lập, cấp ${opts.quyenThuMuc.permTestId} cho "${opts.quyenThuMuc.account}"`
    : ` + thư mục "${duLieu.tenThuMuc}" (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,
    });

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

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

  return duLieu;
};
