import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-model-shared";
import { MINIMAX_DEFAULT_MODEL_ID, MINIMAX_TEXT_MODEL_CATALOG } from "./provider-models.js";

export const DEFAULT_MINIMAX_BASE_URL = "https://api.minimax.io/v1";
export const MINIMAX_API_BASE_URL = "https://api.minimax.io/anthropic";
export const MINIMAX_CN_API_BASE_URL = "https://api.minimaxi.com/anthropic";
export const MINIMAX_HOSTED_MODEL_ID = MINIMAX_DEFAULT_MODEL_ID;
export const MINIMAX_HOSTED_MODEL_REF = `minimax/${MINIMAX_HOSTED_MODEL_ID}`;
export const DEFAULT_MINIMAX_CONTEXT_WINDOW = 204800;
export const DEFAULT_MINIMAX_MAX_TOKENS = 131072;

export const MINIMAX_API_COST = {
  input: 0.3,
  output: 1.2,
  cacheRead: 0.06,
  cacheWrite: 0.375,
};
export const MINIMAX_API_HIGHSPEED_COST = {
  input: 0.6,
  output: 2.4,
  cacheRead: 0.06,
  cacheWrite: 0.375,
};
export const MINIMAX_M25_API_COST = {
  input: 0.3,
  output: 1.2,
  cacheRead: 0.03,
  cacheWrite: 0.375,
};
export const MINIMAX_M25_API_HIGHSPEED_COST = {
  input: 0.6,
  output: 2.4,
  cacheRead: 0.03,
  cacheWrite: 0.375,
};
export const MINIMAX_HOSTED_COST = {
  input: 0,
  output: 0,
  cacheRead: 0,
  cacheWrite: 0,
};
export const MINIMAX_LM_STUDIO_COST = {
  input: 0,
  output: 0,
  cacheRead: 0,
  cacheWrite: 0,
};

type MinimaxCatalogId = keyof typeof MINIMAX_TEXT_MODEL_CATALOG;

export function resolveMinimaxApiCost(modelId: string): ModelDefinitionConfig["cost"] {
  if (modelId === "MiniMax-M2.5-highspeed") {
    return MINIMAX_M25_API_HIGHSPEED_COST;
  }
  if (modelId === "MiniMax-M2.5") {
    return MINIMAX_M25_API_COST;
  }
  if (modelId === "MiniMax-M2.7-highspeed") {
    return MINIMAX_API_HIGHSPEED_COST;
  }
  return MINIMAX_API_COST;
}

export function buildMinimaxModelDefinition(params: {
  id: string;
  name?: string;
  reasoning?: boolean;
  cost: ModelDefinitionConfig["cost"];
  contextWindow: number;
  maxTokens: number;
}): ModelDefinitionConfig {
  const catalog = MINIMAX_TEXT_MODEL_CATALOG[params.id as MinimaxCatalogId];
  // MiniMax-M2.7 supports image input
  const isImageCapable = params.id === "MiniMax-M2.7" || params.id.startsWith("MiniMax-M2.7-");
  return {
    id: params.id,
    name: params.name ?? catalog?.name ?? `MiniMax ${params.id}`,
    reasoning: params.reasoning ?? catalog?.reasoning ?? false,
    input: isImageCapable ? ["text", "image"] : ["text"],
    cost: params.cost,
    contextWindow: params.contextWindow,
    maxTokens: params.maxTokens,
  };
}

export function buildMinimaxApiModelDefinition(modelId: string): ModelDefinitionConfig {
  return buildMinimaxModelDefinition({
    id: modelId,
    cost: resolveMinimaxApiCost(modelId),
    contextWindow: DEFAULT_MINIMAX_CONTEXT_WINDOW,
    maxTokens: DEFAULT_MINIMAX_MAX_TOKENS,
  });
}
