import { describe, expect, it, vi } from "vitest";
import {
  assertRpaWorkerEnv,
  isForbiddenQuoteUrl,
  parseMothershipQuoteUrls,
  shouldKeepBrowserOpen,
  shouldKeepBrowserWarm,
  isParkedSessionEnabled,
  getRpaPlaceFixMode,
  validateMothershipQuoteUrls,
  isWidgetQuoteFallbackEnabled,
  isPreconfirmedMothershipQuote,
  resolveBlindAddressFlow,
  isBlindAddressFlowActive,
} from "@/lib/rpa/env";

describe("lib/rpa/env", () => {
  it("parseMothershipQuoteUrls 解析逗号分隔列表", () => {
    expect(
      parseMothershipQuoteUrls(
        "https://example.com/a , https://example.com/b",
      ),
    ).toEqual(["https://example.com/a", "https://example.com/b"]);
  });

  it("isForbiddenQuoteUrl 拦截 dashboard 与 /quote", () => {
    expect(isForbiddenQuoteUrl("https://dashboard.mothership.com/")).toBe(true);
    expect(isForbiddenQuoteUrl("https://www.mothership.com/quote")).toBe(true);
    expect(isForbiddenQuoteUrl("https://ship.mothership.com/rate")).toBe(false);
  });

  it("validateMothershipQuoteUrls 空列表报错", () => {
    expect(validateMothershipQuoteUrls([])).toContain(
      "MOTHERSHIP_QUOTE_URLS 未配置或为空",
    );
  });

  it("assertRpaWorkerEnv mock 模式跳过校验", () => {
    vi.stubEnv("RPA_MOCK_MODE", "true");
    vi.stubEnv("MOTHERSHIP_QUOTE_URLS", "");
    expect(() => assertRpaWorkerEnv()).not.toThrow();
    vi.unstubAllEnvs();
  });

  it("assertRpaWorkerEnv 缺 URL 时 fail-fast", () => {
    vi.stubEnv("RPA_MOCK_MODE", "false");
    vi.stubEnv("MOTHERSHIP_QUOTE_URLS", "");
    expect(() => assertRpaWorkerEnv()).toThrow(/MOTHERSHIP_QUOTE_URLS/);
    vi.unstubAllEnvs();
  });

  it("assertRpaWorkerEnv 禁止 dashboard URL", () => {
    vi.stubEnv("RPA_MOCK_MODE", "false");
    vi.stubEnv(
      "MOTHERSHIP_QUOTE_URLS",
      "https://dashboard.mothership.com/",
    );
    expect(() => assertRpaWorkerEnv()).toThrow(/禁止的报价入口 URL/);
    vi.unstubAllEnvs();
  });

  it("shouldKeepBrowserOpen 唯一 config 来源", () => {
    vi.stubEnv("RPA_KEEP_BROWSER_OPEN", "true");
    expect(shouldKeepBrowserOpen()).toBe(true);
    vi.stubEnv("RPA_KEEP_BROWSER_OPEN", "false");
    expect(shouldKeepBrowserOpen()).toBe(false);
    vi.unstubAllEnvs();
  });

  it("isRpaHeaded / resolveRpaHeadless：RPA_HEADED 优先", async () => {
    const { isRpaHeaded, resolveRpaHeadless, resolveRpaSlowMoMs } = await import(
      "@/lib/rpa/env"
    );
    vi.stubEnv("RPA_HEADED", "true");
    vi.stubEnv("RPA_HEADLESS", "true");
    expect(isRpaHeaded()).toBe(true);
    expect(resolveRpaHeadless()).toBe(false);
    expect(resolveRpaSlowMoMs()).toBe(200);
    vi.stubEnv("RPA_HEADED", "false");
    vi.stubEnv("RPA_HEADLESS", "true");
    vi.stubEnv("RPA_SLOW_MO_MS", "");
    expect(isRpaHeaded()).toBe(false);
    expect(resolveRpaHeadless()).toBe(true);
    expect(resolveRpaSlowMoMs()).toBeUndefined();
    vi.unstubAllEnvs();
  });

  it("shouldKeepBrowserWarm headless 默认保活", () => {
    vi.stubEnv("RPA_KEEP_BROWSER_WARM", "");
    vi.stubEnv("RPA_HEADLESS", "true");
    expect(shouldKeepBrowserWarm()).toBe(true);
    vi.stubEnv("RPA_KEEP_BROWSER_WARM", "false");
    expect(shouldKeepBrowserWarm()).toBe(false);
    vi.unstubAllEnvs();
  });

  it("isParkedSessionEnabled 默认关，显式 true 才开", () => {
    vi.stubEnv("RPA_PARKED_SESSION", "");
    expect(isParkedSessionEnabled()).toBe(false);
    vi.stubEnv("RPA_PARKED_SESSION", "true");
    expect(isParkedSessionEnabled()).toBe(true);
    vi.unstubAllEnvs();
  });

  it("getRpaPlaceFixMode 默认 event，支持 state/legacy", () => {
    vi.stubEnv("RPA_PLACE_FIX_MODE", "");
    expect(getRpaPlaceFixMode()).toBe("event");
    vi.stubEnv("RPA_PLACE_FIX_MODE", "state");
    expect(getRpaPlaceFixMode()).toBe("state");
    vi.stubEnv("RPA_PLACE_FIX_MODE", "legacy");
    expect(getRpaPlaceFixMode()).toBe("legacy");
    vi.unstubAllEnvs();
  });

  it("isWidgetQuoteFallbackEnabled 默认开，RPA_DISABLE_WIDGET_QUOTE_FALLBACK=true 关闭", () => {
    vi.stubEnv("RPA_DISABLE_WIDGET_QUOTE_FALLBACK", "");
    expect(isWidgetQuoteFallbackEnabled()).toBe(true);
    vi.stubEnv("RPA_DISABLE_WIDGET_QUOTE_FALLBACK", "true");
    expect(isWidgetQuoteFallbackEnabled()).toBe(false);
    vi.unstubAllEnvs();
  });

  it("resolveBlindAddressFlow 对已确认 MotherShip 候选自动启用", () => {
    vi.stubEnv("RPA_BLIND_ADDRESS_FLOW", "false");
    vi.stubEnv("RPA_FAST_QUOTE", "false");
    vi.stubEnv("RPA_VISUAL_RUSH", "false");
    const req = {
      pickup: {
        selectedFromMothership: true,
        mothershipOptionId: "ChIJ-pickup",
        placeId: "",
      },
      delivery: {
        selectedFromMothership: true,
        mothershipOptionId: "ChIJ-delivery",
        placeId: "",
      },
    } as Parameters<typeof isPreconfirmedMothershipQuote>[0];
    expect(isPreconfirmedMothershipQuote(req)).toBe(true);
    expect(resolveBlindAddressFlow(req)).toBe(true);
    expect(
      isBlindAddressFlowActive({ state: { blindAddressFlow: true } }),
    ).toBe(true);
    vi.unstubAllEnvs();
  });
});
