import { DEFAULT_OPENAI_MODEL } from "@capakraken/shared";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { loggedAiCall, sanitizeDiagnosticError } from "../ai-client.js";
import { logger } from "../lib/logger.js";

vi.mock("../lib/logger.js", () => ({
  logger: {
    error: vi.fn(),
    warn: vi.fn(),
    info: vi.fn(),
    debug: vi.fn(),
  },
}));

describe("ai-client diagnostics", () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it("redacts URLs and secret-like tokens from diagnostics", () => {
    const diagnostic = sanitizeDiagnosticError(
      new Error(
        "Request failed at https://example.openai.azure.com/path?api-key=topsecret with Bearer sk-super-secret",
      ),
    );

    expect(diagnostic).toContain("<redacted-url>");
    expect(diagnostic).toContain("<redacted-secret>");
    expect(diagnostic).not.toContain("https://example.openai.azure.com");
    expect(diagnostic).not.toContain("sk-super-secret");
    expect(diagnostic).not.toContain("topsecret");
  });

  it("logs sanitized diagnostics when upstream AI calls fail", async () => {
    const upstreamError = new Error(
      "upstream 404 from https://example.openai.azure.com/openai/deployments/foo?api-key=topsecret with Bearer sk-secret",
    );

    await expect(
      loggedAiCall("azure", DEFAULT_OPENAI_MODEL, 123, async () => {
        throw upstreamError;
      }),
    ).rejects.toBe(upstreamError);

    expect(logger.warn).toHaveBeenCalledWith(
      expect.objectContaining({
        provider: "azure",
        model: DEFAULT_OPENAI_MODEL,
        promptLength: 123,
        responseTimeMs: expect.any(Number),
        errorMessage: expect.any(String),
      }),
      "External API call failed",
    );

    const payload = vi.mocked(logger.warn).mock.calls[0]?.[0];
    expect(payload?.errorMessage).toContain("<redacted-url>");
    expect(payload?.errorMessage).toContain("<redacted-secret>");
    expect(payload?.errorMessage).not.toContain("https://example.openai.azure.com");
    expect(payload?.errorMessage).not.toContain("sk-secret");
    expect(payload?.errorMessage).not.toContain("topsecret");
  });
});
