import * as vscode from 'vscode';
import { SettingsPanelProvider } from '../features/settings/settingsPanelProvider';
import { clearBrainTokenIndex } from '../retrieval';
import { TELEGRAM_TOKEN_SECRET_KEY } from './telegramCommands';
import type { TelegramBot } from '../integrations/telegram/telegramBot';
import type { TelegramHttpClient } from '../integrations/telegram/telegramClient';

export interface SettingsSetupDeps {
    telegramClient: TelegramHttpClient;
    telegramBot: TelegramBot;
    /** LM Studio SDK 다운로드 모델 목록 콜백 — 모델 dropdown 이 보유 모델 전부를 보이도록 전달. */
    lmStudioDownloaded?: () => Promise<string[]>;
}

/**
 * Astra Settings 웹뷰 패널 + 그에 매달린 listener / 명령 묶음. activate() 안에
 * inline 으로 있던 ~40줄 (panel 생성 + 3 listener + 2 command) 을 한 곳으로 모음.
 *
 * panel 인스턴스는 호출자가 `openAsPanel()` 호출용으로 필요해서 반환값에 포함.
 * disposable 들은 호출자가 `context.subscriptions.push(...)` 로 등록.
 *
 *   - config change listener       — `g1nation.*` 변경 시 UI refresh
 *   - brain config change listener — `brainProfiles` / `activeBrainId` 변경 시
 *                                    in-memory 토큰 인덱스 폐기 (stale path 보호)
 *   - secrets change listener      — Telegram 토큰 SecretStorage 변경 시 UI refresh
 *   - g1nation.settings.focus      — 패널 활성화
 *   - g1nation.settings.diagnose   — 패널 등록 여부 확인 (Set 버튼 미동작 신고용)
 */
export function setupSettingsPanel(
    context: vscode.ExtensionContext,
    deps: SettingsSetupDeps,
): { settingsPanel: SettingsPanelProvider; disposables: vscode.Disposable[] } {
    const settingsPanel = new SettingsPanelProvider({
        extensionUri: context.extensionUri,
        context,
        secrets: context.secrets,
        telegramClient: deps.telegramClient,
        telegramBot: deps.telegramBot,
        lmStudioDownloaded: deps.lmStudioDownloaded,
    });

    const disposables: vscode.Disposable[] = [
        vscode.workspace.onDidChangeConfiguration((e) => {
            if (e.affectsConfiguration('g1nation')) void settingsPanel.refresh();
        }),
        vscode.workspace.onDidChangeConfiguration((e) => {
            if (e.affectsConfiguration('g1nation.brainProfiles')
                || e.affectsConfiguration('g1nation.activeBrainId')) {
                clearBrainTokenIndex();
            }
        }),
        context.secrets.onDidChange((e) => {
            if (e.key === TELEGRAM_TOKEN_SECRET_KEY) void settingsPanel.refresh();
        }),
        vscode.commands.registerCommand('g1nation.settings.focus', () => settingsPanel.focus()),
        vscode.commands.registerCommand('g1nation.settings.diagnose', async () => {
            try {
                await settingsPanel.focus();
                vscode.window.showInformationMessage('Astra Settings 패널이 열렸습니다. 사이드바 Settings 항목을 확인하세요.');
            } catch (e: any) {
                vscode.window.showErrorMessage(`Settings 패널 열기 실패 (확장 reload가 필요할 수 있음): ${e?.message ?? e}`);
            }
        }),
    ];

    return { settingsPanel, disposables };
}
