/**
 * Cost calculation utilities — system-ai.
 * Converts token counts to USD cost and USD amounts to token counts.
 */
import { getModelPricing } from '@zync/db/queries'
import type { Db } from '@zync/db/queries'

/**
 * Calculate the USD cost for a given number of input and output tokens.
 * Formula: (inputTokens/1e6) * inputCostPer1m + (outputTokens/1e6) * outputCostPer1m
 */
export async function calculateCost(
  db: Db,
  tokens: { inputTokens: number; outputTokens: number },
  modelId: string,
): Promise<number> {
  const pricing = await getModelPricing(db, modelId)
  if (!pricing) {
    throw new Error(`Model '${modelId}' not found in ai_model_pricing`)
  }
  const inputCost = (tokens.inputTokens / 1_000_000) * pricing.inputCostPer1m
  const outputCost = (tokens.outputTokens / 1_000_000) * pricing.outputCostPer1m
  return inputCost + outputCost
}

/**
 * Convert a USD amount to tokens using the blended rate of the given model.
 * Blended rate = (inputCostPer1m + outputCostPer1m) / 2 per 1M tokens.
 */
export async function usdToTokens(db: Db, usd: number, modelId: string): Promise<number> {
  const pricing = await getModelPricing(db, modelId)
  if (!pricing) {
    throw new Error(`Model '${modelId}' not found in ai_model_pricing`)
  }
  const blendedRate = (pricing.inputCostPer1m + pricing.outputCostPer1m) / 2
  if (blendedRate <= 0) throw new Error('Blended rate is zero or negative')
  return Math.floor((usd / blendedRate) * 1_000_000)
}
