function inferSubProvider(model: string): string | undefined {
  if (model.startsWith("claude-")) return "anthropic"
  if (model.startsWith("gpt-")) return "openai"
  if (model.startsWith("gemini-")) return "google"
  if (model.startsWith("grok-")) return "xai"
  if (model.startsWith("minimax-")) return "minimax"
  if (model.startsWith("kimi-")) return "moonshotai"
  if (model.startsWith("glm-")) return "zai"
  return undefined
}

const CLAUDE_VERSION_DOT = /claude-(\w+)-(\d+)-(\d+)/g
const GEMINI_31_PRO_PREVIEW = /gemini-3\.1-pro(?!-)/g
const GEMINI_3_FLASH_PREVIEW = /gemini-3-flash(?!-)/g

function claudeVersionDot(model: string): string {
  return model.replace(CLAUDE_VERSION_DOT, "claude-$1-$2.$3")
}

function applyGatewayTransforms(model: string): string {
  return claudeVersionDot(model).replace(
    GEMINI_31_PRO_PREVIEW,
    "gemini-3.1-pro-preview",
  )
}

function transformModelForProviderUsingAnthropicBehavior(
  provider: string,
  model: string,
): string {
  if (provider === "vercel") {
    const slashIndex = model.indexOf("/")
    if (slashIndex !== -1) {
      const subProvider = model.substring(0, slashIndex)
      const subModel = model.substring(slashIndex + 1)
      return `${subProvider}/${applyGatewayTransforms(subModel)}`
    }
    const subProvider = inferSubProvider(model)
    if (subProvider) {
      return `${subProvider}/${applyGatewayTransforms(model)}`
    }
    return model
  }
  if (provider === "github-copilot") {
    return claudeVersionDot(model)
      .replace(GEMINI_31_PRO_PREVIEW, "gemini-3.1-pro-preview")
      .replace(GEMINI_3_FLASH_PREVIEW, "gemini-3-flash-preview")
  }
  if (provider === "google") {
    return model
      .replace(GEMINI_31_PRO_PREVIEW, "gemini-3.1-pro-preview")
      .replace(GEMINI_3_FLASH_PREVIEW, "gemini-3-flash-preview")
  }
  if (provider === "anthropic") {
    return model
  }
  return model
}

export function transformModelForProvider(provider: string, model: string): string {
  return transformModelForProviderUsingAnthropicBehavior(provider, model)
}

export function transformModelForProviderDisplay(
  provider: string,
  model: string,
): string {
  return transformModelForProviderUsingAnthropicBehavior(provider, model)
}
