/** Estimated USD pricing — override via env JSON if vendor rates change. */

export interface TokenRates {
  inputPer1M: number;
  outputPer1M: number;
}

const DEFAULT_TEXT_RATES: Record<string, TokenRates> = {
  "claude-opus-4-1-20250805": { inputPer1M: 15, outputPer1M: 75 },
  "claude-opus-4-20250514": { inputPer1M: 15, outputPer1M: 75 },
  "claude-sonnet-4-20250514": { inputPer1M: 3, outputPer1M: 15 },
  "gpt-4o": { inputPer1M: 2.5, outputPer1M: 10 },
  "gpt-4o-mini": { inputPer1M: 0.15, outputPer1M: 0.6 },
  "gpt-4.1": { inputPer1M: 2, outputPer1M: 8 },
};

const DEFAULT_IMAGE_RATES: Record<string, number> = {
  "dall-e-3": 0.04,
  "dall-e-2": 0.02,
  "gpt-image-1": 0.04,
  gemini: 0.03,
  placeholder: 0,
};

export type AiOperationKind = "caption" | "image_brief" | "image";

export interface AiCallUsage {
  operation: AiOperationKind;
  provider: string;
  model: string;
  inputTokens?: number;
  outputTokens?: number;
  totalTokens?: number;
  estimatedCostUsd: number;
  durationMs?: number;
  postId?: string;
  projectId?: string;
  timestamp: string;
}

export interface AiUsageSummary {
  calls: AiCallUsage[];
  totalCostUsd: number;
  currency: "USD";
}

function roundUsd(n: number): number {
  return Math.round(n * 1_000_000) / 1_000_000;
}

export function estimateTextCostUsd(input: {
  model: string;
  inputTokens?: number;
  outputTokens?: number;
}): number {
  const inTok = input.inputTokens ?? 0;
  const outTok = input.outputTokens ?? 0;
  const modelLower = input.model.toLowerCase();
  const rates =
    DEFAULT_TEXT_RATES[input.model] ??
    Object.entries(DEFAULT_TEXT_RATES).find(([key]) => modelLower.includes(key.split("-").slice(0, 2).join("-")))?.[1] ??
    DEFAULT_TEXT_RATES["gpt-4o"];

  const cost =
    (inTok / 1_000_000) * rates.inputPer1M + (outTok / 1_000_000) * rates.outputPer1M;
  return roundUsd(cost);
}

export function estimateImageCostUsd(provider: string, model?: string): number {
  if (provider === "placeholder") return 0;
  if (provider === "gemini") return DEFAULT_IMAGE_RATES.gemini;
  const key = model?.startsWith("dall-e-2") ? "dall-e-2" : "dall-e-3";
  return DEFAULT_IMAGE_RATES[key] ?? DEFAULT_IMAGE_RATES["dall-e-3"];
}

export function summarizeUsage(calls: AiCallUsage[]): AiUsageSummary {
  const totalCostUsd = roundUsd(calls.reduce((sum, c) => sum + c.estimatedCostUsd, 0));
  return { calls, totalCostUsd, currency: "USD" };
}

export function formatCostUsd(amount: number): string {
  if (amount === 0) return "$0.00";
  if (amount < 0.01) return `$${amount.toFixed(4)}`;
  return `$${amount.toFixed(2)}`;
}
