import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import {
  openManCapNhatThuMuc,
  openTabThuMuc,
  getThuMucModal,
  checkBadgeTabPhanQuyen,
  datQuyenDocLap,
  themQuyenTrongModalThuMuc,
  luuModalThuMuc,
  openChiTietTaiLieu,
  openCapNhatQuyenTaiLieu,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { DuLieu } from "./1.4.6.setup";

/**
 * Thao tác dùng chung cho bộ case **UC25 — 1.4.6**
 * (Cập nhật quyền của thư mục, tài liệu trong Cấu trúc hồ sơ).
 *
 * Khác `1.4.6.setup.ts` (dựng dữ liệu tiền điều kiện), file này chứa các **bước thao tác**
 * mà nhiều case dùng lại.
 */

/**
 * Cập nhật phân quyền của 1 thư mục rồi lưu — đúng chuỗi thao tác QA mô tả:
 *
 * 1. Mở màn hình cập nhật TM (tab "Phân quyền", đang là "Kế thừa")
 * 2. Click "Đặt quyền độc lập"
 * 3. Click "Xác nhận" ở hộp thoại
 * 4. Cập nhật lại đối tượng được phân quyền — thêm `nguoiDuocThem` vào **cả 5 trường quyền**
 *    (chỉ thêm, không xoá người đang kế thừa)
 * 5. Nhấn "Xác nhận" ở cuối màn hình để lưu
 *
 * @param nguoiDuocThem account id hoặc tên nhóm người dùng
 */
export const capNhatVaLuuPhanQuyenThuMuc = async (
  userPage: Page,
  duLieu: DuLieu,
  nguoiDuocThem: string,
) => {
  await test.step("1. Mở màn hình cập nhật Thư mục → tab Phân quyền", async () => {
    await openManCapNhatThuMuc(userPage, duLieu.recordUrl, duLieu.tenThuMuc);
    await openTabThuMuc(userPage, "Phân quyền");
    await checkBadgeTabPhanQuyen(userPage, "Kế thừa");
  });

  await test.step('2 + 3. Click "Đặt quyền độc lập" rồi click "Xác nhận"', async () => {
    await datQuyenDocLap(userPage, getThuMucModal(userPage));
  });

  await test.step(`4. Cập nhật lại đối tượng phân quyền: thêm "${nguoiDuocThem}" vào cả 5 trường quyền`, async () => {
    await themQuyenTrongModalThuMuc(userPage, nguoiDuocThem);
  });

  await test.step('5. Nhấn "Xác nhận" để lưu', async () => {
    await luuModalThuMuc(
      userPage,
      getThuMucModal(userPage),
      `Lưu phân quyền thư mục ${duLieu.tenThuMuc}`,
    );
  });
};

/**
 * Cập nhật phân quyền của **Tài liệu** rồi lưu — chuỗi thao tác của case 609 / 610:
 *
 * 1. Mở màn chi tiết TL → menu `...` → "Kiểm tra phân quyền"
 *    (màn "Cập nhật quyền tài liệu <mã TL>")
 * 2. Nếu TL đang kế thừa: bấm "Đặt quyền độc lập" + "Xác nhận" — **bắt buộc**, vì lúc còn
 *    kế thừa app không render ô nhập nào nên không sửa được đối tượng phân quyền.
 * 3. Thêm `nguoiDuocThem` vào cả 5 trường quyền (bỏ qua nếu không truyền)
 * 4. Nhấn "Xác nhận" ở cuối màn để lưu → toast "Đang xử lý" → "Thành công", modal tự đóng
 *
 * Xem KHO-TAI-LIEU.MODAL-CAP-NHAT-QUYEN-TAI-LIEU.md.
 */
export const capNhatVaLuuQuyenTaiLieu = async (
  userPage: Page,
  duLieu: DuLieu,
  nguoiDuocThem?: string,
  opts: { datQuyenDocLapTruoc?: boolean; moTa?: string } = {},
) => {
  const moTa = opts.moTa ? ` (${opts.moTa})` : "";

  await test.step(`1. Mở chi tiết Tài liệu → menu [...] → Kiểm tra phân quyền${moTa}`, async () => {
    await openChiTietTaiLieu(userPage, duLieu.recordUrl, duLieu.tenTaiLieuCon);
    await openCapNhatQuyenTaiLieu(userPage);
  });

  if (opts.datQuyenDocLapTruoc) {
    await test.step('1b. Tài liệu đang kế thừa → "Đặt quyền độc lập" + "Xác nhận" để mở khoá các trường quyền', async () => {
      await checkBadgeTabPhanQuyen(userPage, "Kế thừa");
      await datQuyenDocLap(userPage, getThuMucModal(userPage));
    });
  }

  if (nguoiDuocThem) {
    await test.step(`2. Cập nhật lại đối tượng phân quyền: thêm "${nguoiDuocThem}" vào cả 5 trường quyền`, async () => {
      await themQuyenTrongModalThuMuc(userPage, nguoiDuocThem);
    });
  }

  await test.step('3. Nhấn "Xác nhận" để lưu', async () => {
    await luuModalThuMuc(
      userPage,
      getThuMucModal(userPage),
      `Lưu phân quyền tài liệu ${duLieu.tenTaiLieuCon}`,
    );
  });
};
