import { expect, test, Page } from "@playwright/test";
import {
    goToAppMarket,
    installComponent,
    checkComponent,
    selectLog,
    kubectlGetFirstPodByNamePrefix,
    withKubectlSsh,
    verifyUiLogWithKubectl,
    verifyLogExport,
    verifyResourceSortInResourceTab,
} from "./utils/application";
import { cleanupAfterEach } from "./utils/application-cleanup";
import type { DeployPlan } from "./test-application.constants";
import {
    totalTimeout,
    serviceClusterUrl,
    appNameAiaio,
    appNameMonitor,
    componentNameMonitor,
    PLAN_APP_AIAIO,
} from "./test-application.constants";

test.describe("应用管理-详情", () => {
    let createdApps: DeployPlan[] = [];
    test.beforeEach(async ({ page }) => {
        await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
    });
    test.afterEach(async ({ page }) => {
        await cleanupAfterEach(page, {
            createdApps,
        });
    });

    async function installComponentTracked(page: any, plan: DeployPlan) {
        await installComponent(page, plan.componentName, plan.appName);
        createdApps.push(plan);
    }

    async function deployComponents(page: any, plans: DeployPlan[]) {
        for (const plan of plans) {
            await test.step(`部署前置组件(${plan.componentName} -> ${plan.appName})`, async () => {
                await goToAppMarket(page);
                await installComponentTracked(page, plan);
                await checkComponent(page, plan.appName, {
                    entry: plan.entry,
                    serviceClusterUrl,
                });
            });
        }
    }
    async function verifyResourceInfoDisplay(
        page: any,
        _opts: { creationHeader: string; creationKind: "event" | "time" },
    ) {
        const table = page.getByRole("table").first();
        await expect(table).toBeVisible();
        const empty = page.getByText(/暂无(内容|数据)/).first();
        await expect(table.locator("tbody tr").first().or(empty)).toBeVisible();
    }

    async function filterEvents(page: Page, options: {
        resourceName: string;
        resourceType: string;
        level: string;
        namespace: string;
    }) {
        const selects = page.locator(".container-platform-select-selector");
        await selects.nth(1).click();
        await page.keyboard.type(options.resourceName);
        await page.getByTitle(options.resourceName, { exact: true }).locator("div").click();
        await selects.nth(2).click();
        await page.getByTitle(options.resourceType, { exact: true }).locator("div").click();
        await selects.nth(3).click();
        await page.getByTitle(options.level, { exact: true }).locator("div").click();
        await selects.nth(4).click();
        await page.getByTitle(options.namespace, { exact: true }).locator("div").click();
        await page.getByRole("button", { name: /查\s*询/ }).click();
    }

    test("【应用运维-应用详情-017】应用管理-详情-日志标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await test.step("进入应用管理-详情页面-日志标签页并筛选", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
            await page.getByRole("textbox", { name: /搜索.*名称/ }).fill("local-harbor");
            await page.getByRole("button", { name: "search" }).click();
            await page.getByRole("link", { name: "local-harbor" }).click();
            await page.getByRole("tab", { name: "日志" }).click();
            await selectLog(page, "local-harbor-chartmuseum", "chartmuseum");
        });
        await test.step("验证筛选成功并重置", async () => {
            await page.waitForTimeout(2000);
            await expect(page.getByText("暂无日志")).not.toBeVisible();
            await page.getByRole("button", { name: "重 置" }).click();
        });
    });

    test("【应用运维-扩展详情-017】扩展管理-详情-日志标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入日志标签页并筛选", async () => {
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "日志" }).click();
            await selectLog(page, "monitoring-dashboard-service", "monitoring-dashboard-service");
        });
        await test.step("验证筛选成功并重置", async () => {
            await expect(page.getByText("暂无日志")).not.toBeVisible();
            await page.getByRole("button", { name: "重 置" }).click();
        });
    });

    test("【应用运维-应用详情-020】应用管理-详情-事件标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await test.step("进入事件标签页并筛选", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
            await page.getByRole("textbox", { name: /搜索.*名称/ }).fill("local-harbor");
            await page.getByRole("button", { name: "search" }).click();
            await page.getByRole("link", { name: "local-harbor" }).click();
            await page.getByRole("tab", { name: "事件" }).click();
            await filterEvents(page, {
                resourceName: "local-harbor-chartmuseum",
                resourceType: "Deployment",
                level: "正常",
                namespace: "openfuyao-system",
            });
        });
        await test.step("验证筛选结果并重置", async () => {
            await page.getByRole("button", { name: "重 置" }).click();
            await expect(page.locator(".container-platform-select-selector").nth(3)).toHaveText("全部");
        });
    });

    test("【应用运维-扩展详情-020】扩展管理-详情-事件标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入事件标签页并筛选", async () => {
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "事件" }).click();
            await filterEvents(page, {
                resourceName: "monitoring-dashboard-service",
                resourceType: "Deployment",
                level: "正常",
                namespace: "monitoring-dashboard",
            });
        });
        await test.step("验证筛选成功并重置", async () => {
            await page.getByRole("button", { name: "重 置" }).click();
            await expect(page.locator(".container-platform-select-selector").nth(3)).toHaveText("全部");
        });
    });

    test("【应用运维-应用详情-008】应用管理-概览-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, PLAN_APP_AIAIO);
        await test.step("进入应用管理-Helm详情页面-资源标签页", async () => {
            await page.getByRole("link", { name: "应用管理" }).click();
            await page.getByRole("link", { name: appNameAiaio }).click();
            await page.getByRole("tab", { name: "资源" }).click();
            await expect(page.getByRole("table")).toBeVisible();
        });
        await test.step("校验资源信息展示正确(创建事件)", async () => {
            await verifyResourceInfoDisplay(page, { creationHeader: "创建事件", creationKind: "event" });
        });
    });

    test("【应用运维-扩展详情-008】扩展管理-概览-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入扩展组件管理-详情页面-资源标签页", async () => {
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "资源" }).click();
            await expect(page.getByRole("table")).toBeVisible();
        });
        await test.step("校验资源信息展示正确(创建时间)", async () => {
            await verifyResourceInfoDisplay(page, { creationHeader: "创建时间", creationKind: "time" });
        });
    });

    test("【应用运维-扩展详情-014】扩展管理-详情-资源标签-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入扩展组件管理-详情页面-资源标签页", async () => {
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "资源" }).click();
            await expect(page.getByRole("table")).toBeVisible();
        });
        await verifyResourceSortInResourceTab(page);
    });

    test("【应用运维-应用详情-014】应用管理-详情-资源标签-排序-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, PLAN_APP_AIAIO);
        await test.step("进入应用管理-Helm详情页面-资源标签页", async () => {
            await page.getByRole("link", { name: "应用管理" }).click();
            await page.getByRole("link", { name: appNameAiaio }).click();
            await page.getByRole("tab", { name: "资源" }).click();
            await expect(page.getByRole("table")).toBeVisible();
        });
        await verifyResourceSortInResourceTab(page);
    });

    test("【应用运维-扩展详情-015】扩展管理-详情-资源标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入扩展组件管理-详情页面-资源标签页", async () => {
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "资源" }).click();
            await expect(page.getByRole("table")).toBeVisible();
        });
        await test.step("按资源名称搜索并校验结果", async () => {
            await page.getByRole("textbox", { name: "资源名称" }).fill("monitoring-dashboard");
            await page.getByRole("button", { name: "search" }).click();
            await expect(page.getByRole("table")).toContainText("monitoring-dashboard");
        });
        await test.step("按类型与状态筛选并校验", async () => {
            await page.getByLabel("类型").getByRole("button", { name: "filter" }).click();
            await page.getByRole("menuitem", { name: "ClusterRole", exact: true }).click();
            await page.getByRole("button", { name: /确\s*定/ }).click();
            await expect(page.getByRole("table")).toContainText("ClusterRole");
            await page.getByLabel("状态").getByRole("button", { name: "filter" }).click();
            await page.getByText("运行中失败创建中删除中").click();
            await page.getByRole("menuitem", { name: "运行中", exact: true }).click();
            await page.getByRole("button", { name: /确\s*定/, exact: true }).click();
            await expect(page.getByRole("table")).toContainText("运行中");
        });
    });

    test("【应用运维-应用详情-015】应用管理-详情-资源标签-筛选-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, PLAN_APP_AIAIO);
        await test.step("进入应用管理-Helm详情页面-资源标签页", async () => {
            await page.getByRole("link", { name: "应用管理" }).click();
            await page.getByRole("link", { name: appNameAiaio }).click();
            await page.getByRole("tab", { name: "资源" }).click();
            await expect(page.getByRole("table")).toBeVisible();
        });
        await test.step("按资源名称搜索并校验结果", async () => {
            await page.getByRole("textbox", { name: "资源名称" }).fill("aiaio");
            await page.getByRole("button", { name: "search" }).click();
            await expect(page.getByRole("table")).toContainText("aiaio");
        });
        await test.step("按类型与状态筛选并校验", async () => {
            await page.getByLabel("类型").getByRole("button", { name: "filter" }).click();
            await page.getByRole("menuitem", { name: "ConfigMap", exact: true }).click();
            await page.getByRole("button", { name: /确\s*定/ }).click();
            await expect(page.getByRole("table")).toContainText("ConfigMap");
            await page.getByLabel("状态").getByRole("button", { name: "filter" }).click();
            await page.getByText("运行中失败创建中删除中").click();
            await page.getByRole("menuitem", { name: "运行中", exact: true }).click();
            await page.getByRole("button", { name: /确\s*定/, exact: true }).click();
            await expect(page.getByRole("table")).toContainText("运行中");
        });
    });

    test("【应用运维-应用详情-016】应用管理-详情-日志标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await deployComponents(page, PLAN_APP_AIAIO);
        await test.step("进入应用管理-Helm详情页面-日志标签页", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
            await expect(page.getByRole("table")).toBeVisible();
            await page.getByRole("link", { name: appNameAiaio }).click();
            await page.getByRole("tab", { name: "日志" }).click();
        });
        await test.step("对比 kubectl logs 与 UI 日志内容", async () => {
            await withKubectlSsh(async (ssh) => {
                // 先用 kubectl 找到精确 podName,再在 UI 里按 title 精确选中同一个实例
                const pod = await kubectlGetFirstPodByNamePrefix(ssh, "bke-cluster", "test-aiaio-node-feature-discovery-gc");
                const podTitleLoc = page.getByTitle(pod.podName);
                if ((await podTitleLoc.count()) > 0) {
                    await podTitleLoc.locator("div").first().click();
                } else {
                    await page.getByText(/kuberay-operator-/).first().click().catch(() => {});
                    await podTitleLoc.locator("div").first().click();
                }
                const queryBtn = page.getByRole("button", { name: /查\s*询/ }).first();
                await queryBtn.click();
                await page.waitForTimeout(2000);
                await verifyUiLogWithKubectl(page, ssh, {
                    kubectlNamespace: "bke-cluster",
                    kubectlPodNamePrefix: "test-aiaio-node-feature-discovery-gc",
                });
            });
        });
    });

    test("【应用运维-扩展详情-016】扩展管理-详情-日志标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入扩展组件管理-详情页面-日志标签页", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/extendManage");
            await expect(page.getByRole("table")).toBeVisible();
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "日志" }).click();
            const queryBtn = page.getByRole("button", { name: /查\s*询/ });
            if (await queryBtn.count()) {
                await queryBtn.first().click();
            }
            await page.waitForTimeout(2000);
        });
        await test.step("对比 kubectl logs 与 UI 日志内容", async () => {
            await withKubectlSsh(async (ssh) => {
                await verifyUiLogWithKubectl(page, ssh, {
                    kubectlNamespace: "monitoring-dashboard",
                    kubectlPodNamePrefix: "monitoring-dashboard-service",
                    kubectlContainerName: "monitoring-dashboard-service",
                });
            });
        });
    });

    test("【应用运维-扩展详情-024】扩展管理-详情-详情标签-扩展界面编辑-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await test.step("部署扩展组件并进入详情页", async () => {
            await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
            await page.getByRole("link", { name: appNameMonitor }).click();
        });
        await test.step("进入详情标签页", async () => {
            await page.getByRole("tab", { name: "详情" }).click();
            await expect(page.getByText("扩展界面启停")).toBeVisible();
        });
        await test.step("编辑扩展界面并保存", async () => {
            await page.getByRole("img", { name: "edit" }).locator("svg").click();
            await page.getByRole("button", { name: "保 存" }).click();
            await page.locator("div").filter({ hasText: /^monitoring-dashboard$/ }).first().click();
            const switchBtn = page.getByRole("switch");
            const beforeChecked = (await switchBtn.getAttribute("aria-checked")) ?? "";
            await page.getByRole("img", { name: "edit" }).locator("svg").click();
            await switchBtn.click();
            await page.getByRole("button", { name: "保 存" }).click();
            await page.locator("div").filter({ hasText: /^monitoring-dashboard$/ }).click();
            const refreshHint = page.getByText("扩展组件发生更新,请刷新以展示最新版本的页面。");
            await expect(refreshHint).toBeVisible({ timeout: 60_000 });
            await refreshHint.click();
            await expect
                .poll(async () => (await switchBtn.getAttribute("aria-checked")) ?? "", {
                    timeout: 60_000,
                    intervals: [500, 1000, 2000],
                })
                .not.toBe(beforeChecked);
        });
    });

    test("【应用运维-应用详情-019】应用管理-详情-事件标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await deployComponents(page, PLAN_APP_AIAIO);
        await test.step("进入应用管理-Helm详情页面-事件标签页", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/applicationManageHelm");
            await expect(page.getByRole("link", { name: appNameAiaio })).toBeVisible();
            await page.getByRole("link", { name: appNameAiaio }).click();
            await page.getByRole("tab", { name: "事件" }).click();
            await filterEvents(page, {
                resourceName: "kuberay-operator",
                resourceType: "Deployment",
                level: "正常",
                namespace: "bke-cluster",
            });
        });
        await test.step("查询后确认展示时间线", async () => {
            const eventTabPanel = page.getByRole("tabpanel", { name: "事件" });
            const timelineFirstItem = eventTabPanel
                .locator(".helm_event_timeLine .container-platform-timeline-item, .event_timeLine li")
                .first();
            await expect(timelineFirstItem).toBeVisible({ timeout: 30_000 });
        });
    });

    test("【应用运维-扩展详情-019】扩展管理-详情-事件标签-信息展示-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        test.setTimeout(totalTimeout);
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入扩展组件管理-详情页面-事件标签页", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/extendManage");
            await expect(page.getByRole("link", { name: appNameMonitor })).toBeVisible();
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "事件" }).click();
            await expect(page.getByRole("tab", { name: "事件" })).toBeVisible();
            await filterEvents(page, {
                resourceName: "monitoring-dashboard-service",
                resourceType: "Deployment",
                level: "正常",
                namespace: "monitoring-dashboard",
            });
        });
        await test.step("查询后确认展示时间线", async () => {
            const eventTabPanel = page.getByRole("tabpanel", { name: "事件" });
            const timelineFirstItem = eventTabPanel
                .locator(".helm_event_timeLine .container-platform-timeline-item, .event_timeLine li")
                .first();
            await expect(timelineFirstItem).toBeVisible({ timeout: 30_000 });
        });
    });

    test.use({ acceptDownloads: true });

    test("【应用运维-应用详情-018】应用管理-详情-日志标签-导出-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await test.step("进入应用管理-Helm详情页面-日志标签页", async () => {
            await page.getByRole("link", { name: "应用管理" }).click();
            await page.getByRole("link", { name: "local-harbor" }).click();
            await page.getByRole("tab", { name: "日志" }).click();
        });
        await test.step("等待日志就绪并导出校验下载文件", async () => {
            await verifyLogExport(page, test.info().outputDir);
        });
    });

    test("【应用运维-扩展详情-018】扩展管理-详情-日志标签-导出-基础功能验证 ", { tag: ["@v24.06", "@application"] }, async ({ page }) => {
        await deployComponents(page, [{ componentName: componentNameMonitor, appName: appNameMonitor, entry: "extendManage" }]);
        await test.step("进入扩展组件管理-详情页面-日志标签页", async () => {
            await page.goto(serviceClusterUrl + "/container_platform/extendManage");
            await page.getByRole("link", { name: appNameMonitor }).click();
            await page.getByRole("tab", { name: "日志" }).click();
        });
        await test.step("等待日志就绪并导出校验下载文件", async () => {
            await verifyLogExport(page, test.info().outputDir);
        });
    });
});