/**
 * Provider 별 API key + enable 토글 저장소.
 *
 * 설계:
 *   - API key 자체는 vscode.SecretStorage (secrets) 에 — settings.json / Settings Sync 침범 안 받음.
 *   - enabled 토글은 일반 settings (g1nation.providers.<id>.enabled) — 사용자가 패널에서 토글 시 read/write.
 *
 * Secret 저장 key 네이밍: `g1nation.providers.<id>.apiKey`. 동일 인터페이스로 향후 provider 추가.
 */

import * as vscode from 'vscode';
import { ProviderId } from './types';

export interface ProviderConfig {
    enabled: boolean;
    apiKey: string;
    /** Provider-specific default model (없으면 사용자가 매번 선택). */
    defaultModel: string;
}

function _secretKey(id: ProviderId): string {
    return `g1nation.providers.${id}.apiKey`;
}

function _settingsScope(id: ProviderId): vscode.WorkspaceConfiguration {
    return vscode.workspace.getConfiguration(`g1nation.providers.${id}`);
}

export async function readProviderConfig(context: vscode.ExtensionContext, id: ProviderId): Promise<ProviderConfig> {
    const s = _settingsScope(id);
    const apiKey = (await context.secrets.get(_secretKey(id))) ?? '';
    return {
        enabled: !!s.get<boolean>('enabled', false),
        apiKey,
        defaultModel: s.get<string>('defaultModel', '') ?? '',
    };
}

/**
 * patch 의 필드만 갱신.
 *   - enabled / defaultModel → settings (Global target)
 *   - apiKey → secrets (set if truthy, delete if empty string)
 */
export async function writeProviderConfig(
    context: vscode.ExtensionContext,
    id: ProviderId,
    patch: Partial<ProviderConfig>,
): Promise<void> {
    const s = _settingsScope(id);
    if (typeof patch.enabled === 'boolean') {
        await s.update('enabled', patch.enabled, vscode.ConfigurationTarget.Global);
    }
    if (typeof patch.defaultModel === 'string') {
        await s.update('defaultModel', patch.defaultModel || undefined, vscode.ConfigurationTarget.Global);
    }
    if (typeof patch.apiKey === 'string') {
        const key = patch.apiKey.trim();
        if (key) {
            await context.secrets.store(_secretKey(id), key);
        } else {
            await context.secrets.delete(_secretKey(id));
        }
    }
}

/** SettingsPanel 표시용 — secret 값 자체는 노출 X. 설정 여부만 boolean. */
export async function readProviderStatus(context: vscode.ExtensionContext, id: ProviderId): Promise<{
    enabled: boolean;
    hasApiKey: boolean;
    defaultModel: string;
}> {
    const cfg = await readProviderConfig(context, id);
    return {
        enabled: cfg.enabled,
        hasApiKey: !!cfg.apiKey,
        defaultModel: cfg.defaultModel,
    };
}
