/**
 * Cloud LLM provider routing — model id prefix → provider id 매핑.
 *
 * Prefix 규칙:
 *   openrouter:anthropic/claude-3.5-sonnet  → { provider: 'openrouter', model: 'anthropic/claude-3.5-sonnet' }
 *   anthropic:claude-3-5-sonnet-20241022    → { provider: 'anthropic',  model: 'claude-3-5-sonnet-20241022' }
 *   gemini:gemini-2.0-flash-exp             → { provider: 'gemini',     model: 'gemini-2.0-flash-exp' }
 *   gemma4:e2b                              → null  (local: Ollama / LM Studio 가 처리)
 *
 * 왜 prefix 인가:
 *   - 같은 model name 이 OpenRouter / Anthropic 직통에 동시 존재 가능 — 출처를 명시해야 라우팅 모호성 없음.
 *   - sidebar 의 모델 dropdown 에 표시 시 그룹화 ('OpenRouter · ...' 등) 가능.
 *   - 옛 사용자 model 설정 ('gemma4:e2b') 은 prefix 없으니 자동으로 local 경로.
 */

export type ProviderId = 'openrouter' | 'anthropic' | 'gemini';

export interface ChatMessage {
    role: 'system' | 'user' | 'assistant';
    content: string;
}

export interface StreamParams {
    model: string;
    messages: ChatMessage[];
    temperature: number;
    maxTokens: number;
    signal?: AbortSignal;
}

const PROVIDER_PREFIXES: ReadonlyArray<{ prefix: string; id: ProviderId }> = [
    { prefix: 'openrouter:', id: 'openrouter' },
    { prefix: 'anthropic:', id: 'anthropic' },
    { prefix: 'gemini:', id: 'gemini' },
];

/**
 * model id 의 prefix 를 분석해서 provider 와 실제 모델명 분리.
 * prefix 매칭 안 되면 null — 호출자는 local engine 경로로.
 */
export function parseModelPrefix(modelId: string): { provider: ProviderId; model: string } | null {
    if (!modelId) return null;
    for (const { prefix, id } of PROVIDER_PREFIXES) {
        if (modelId.startsWith(prefix)) {
            return { provider: id, model: modelId.slice(prefix.length) };
        }
    }
    return null;
}

/** 역변환 — provider + 실제 model → prefixed id. UI / config 저장용. */
export function makeModelId(provider: ProviderId, model: string): string {
    return `${provider}:${model}`;
}

/** UI 표시용 짧은 라벨. */
export function providerLabel(p: ProviderId): string {
    switch (p) {
        case 'openrouter': return 'OpenRouter';
        case 'anthropic': return 'Anthropic';
        case 'gemini': return 'Gemini';
    }
}
