import { Page } from "@playwright/test";
import { test, expect, ACCOUNT } from "../../../src/fixture/base-test";
import { TIMEOUT } from "../../../src/constant/timeout";
import { PW } from "../../../src/utils/PW";
import { uc19DefaultData, uc19RegisterURLPath } from "../uc19.default.data";

const BASE_URL = process.env.BASE_URL!;

const runTest = async (page: Page) => {
  const pw = new PW(page);
  const errors: string[] = [];

  await test.step("1. Truy cập màn hình Kho tài liệu", async () => {
    await page.goto(`${BASE_URL}${uc19RegisterURLPath}`);
  });
  await test.step("2. Chọn nút Tạo mới", async () => {
    await pw.isVisible("btn-create-hstl", TIMEOUT.PAGE_LOADING);
    await pw.wait(TIMEOUT.HARD_WAITING);
    await pw.clickButton("btn-create-hstl");
  });

  // TC 1.1.2.30: [Dự án] Kiểm tra ẩn/hiện trường
  await test.step("1.1.2.33 - [Dự án] Kiểm tra điều kiện ẩn/hiện trường", async () => {
    try {
      await expect(page.getByTestId("sel-duAn"), {
        message: "Lỗi: Trường [Dự án] phải ẩn khi chưa chọn Loại Hồ sơ dự án",
      }).not.toBeVisible({ timeout: TIMEOUT.ELEMENT });
      await pw.inputWithSelDuAn();
      await pw.inputWithoutSelDuAn();
      await expect(page.getByTestId("sel-duAn"), {
        message: "Lỗi: Trường [Dự án] phải hiện khi chọn Loại là Hồ sơ dự án",
      }).toBeVisible({ timeout: TIMEOUT.CONTROL_LOADING });
    } catch (e) {
      errors.push(`[1.1.2.33] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.26: [Dự án] Kiểm tra giá trị mặc định
  await test.step("1.1.2.29 - [Dự án] Kiểm tra giá trị mặc định", async () => {
    try {
      let count = 0;
      do {
        const isDuAnVisible = await page.getByTestId("sel-duAn").isVisible();
        if (isDuAnVisible) {
          break;
        } else {
          await pw.inputDropDownList("sel-loaiBoHoSo");
        }
        if (count > 10) {
          break;
        }
        count++;
      } while (true);
      await pw.isEmpty("sel-duAn");
    } catch (e) {
      errors.push(`[1.1.2.29] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.28: [Dự án] Tính năng tìm kiếm option
  await test.step("1.1.2.31 - [Dự án] Tìm kiếm option", async () => {
    try {
      await pw.inputDropDownList(
        "sel-companyInvestor",
        "Công ty TNHH Mặt Trời Phú Quốc",
      );
      await pw.wait(2000); // Chờ dữ liệu load lại

      let count = 0;
      do {
        const isDuAnVisible = await page.getByTestId("sel-duAn").isVisible();
        if (isDuAnVisible) {
          break;
        } else {
          await pw.inputDropDownList("sel-loaiBoHoSo");
        }
        if (count > 10) {
          break;
        }
        count++;
      } while (true);
      await pw.wait(2000); // Chờ dữ liệu load lại
      await pw.checkSearchDropdownHasOption("sel-duAn", "dau tu nang cap");
    } catch (e) {
      errors.push(`[1.1.2.31] ${(e as Error).message}`);
    }
  });

  if (errors.length > 0) {
    throw new Error(`Các test case thất bại:\n${errors.join("\n")}`);
  }
};

test(
  "UC19 1.1.2.29-31-33 - [Dự án] Tổng hợp kiểm tra ẩn/hiện, giá trị mặc định, tìm kiếm - Thủ thư " +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTest(librarian);
  },
);
test(
  "UC19 1.1.2.29-31-33 - [Dự án] Tổng hợp kiểm tra ẩn/hiện, giá trị mặc định, tìm kiếm - Admin " +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
