import * as vscode from 'vscode';
import { InlineCompletionProvider } from './inlineCompletion';
import { ChatPanel } from './chatPanel';
import { AbysiusApi } from './api';

let inlineProvider: InlineCompletionProvider | undefined;
let chatPanel: ChatPanel | undefined;
let api: AbysiusApi;

export function activate(context: vscode.ExtensionContext) {
    const config = vscode.workspace.getConfiguration('abysius');
    
    // Initialize API client
    api = new AbysiusApi({
        apiKey: config.get<string>('apiKey', ''),
        chatEndpoint: config.get<string>('chatEndpoint', 'https://api.abysius.ai/v1/chat'),
        inlineEndpoint: config.get<string>('inlineEndpoint', 'https://api.abysius.ai/v1/inline'),
        model: config.get<string>('model', 'abysius-coder')
    });

    // Register inline completion provider
    if (config.get<boolean>('enableInlineCompletions', true)) {
        inlineProvider = new InlineCompletionProvider(api);
        
        const selector: vscode.DocumentSelector = [
            { scheme: 'file' },
            { scheme: 'untitled' }
        ];
        
        const provider = vscode.languages.registerInlineCompletionItemProvider(
            selector,
            inlineProvider
        );
        context.subscriptions.push(provider);
    }

    // Register chat panel
    chatPanel = new ChatPanel(context.extensionUri, api);
    
    const chatViewProvider = vscode.window.registerWebviewViewProvider(
        'abysius.chatPanel',
        chatPanel,
        { webviewOptions: { retainContextWhenHidden: true } }
    );
    context.subscriptions.push(chatViewProvider);

    // Set context for UI visibility
    vscode.commands.executeCommand('setContext', 'abysiusChatEnabled', true);

    // Commands
    context.subscriptions.push(
        vscode.commands.registerCommand('abysius.openChat', () => {
            chatPanel?.show();
        }),
        
        vscode.commands.registerCommand('abysius.acceptInlineCompletion', () => {
            inlineProvider?.accept();
        }),
        
        vscode.commands.registerCommand('abysius.rejectInlineCompletion', () => {
            inlineProvider?.reject();
        }),
        
        vscode.commands.registerCommand('abysius.triggerInlineCompletion', () => {
            inlineProvider?.trigger();
        }),
        
        vscode.commands.registerCommand('abysius.acceptNextWord', () => {
            inlineProvider?.acceptNextWord();
        }),
        
        vscode.commands.registerCommand('abysius.openSettings', () => {
            vscode.commands.executeCommand('workbench.action.openSettings', 'abysius');
        }),
        
        vscode.commands.registerCommand('abysius.clearChat', () => {
            chatPanel?.clear();
        })
    );

    // Listen for configuration changes
    context.subscriptions.push(
        vscode.workspace.onDidChangeConfiguration(e => {
            if (e.affectsConfiguration('abysius')) {
                const newConfig = vscode.workspace.getConfiguration('abysius');
                api.updateConfig({
                    apiKey: newConfig.get<string>('apiKey', ''),
                    chatEndpoint: newConfig.get<string>('chatEndpoint', 'https://api.abysius.ai/v1/chat'),
                    inlineEndpoint: newConfig.get<string>('inlineEndpoint', 'https://api.abysius.ai/v1/inline'),
                    model: newConfig.get<string>('model', 'abysius-coder')
                });
            }
        })
    );

    // Status bar item
    const statusItem = vscode.window.createStatusBarItem(
        vscode.StatusBarAlignment.Right,
        100
    );
    statusItem.text = "$(sparkle) Abysius";
    statusItem.tooltip = "Abysius AI is active";
    statusItem.command = 'abysius.openChat';
    statusItem.show();
    context.subscriptions.push(statusItem);

    console.log('[Abysius AI] Extension activated');
}

export function deactivate() {
    inlineProvider?.dispose();
    chatPanel?.dispose();
    console.log('[Abysius AI] Extension deactivated');
}
