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;

async function showPrivacyNotice(context: vscode.ExtensionContext) {
    const result = await vscode.window.showInformationMessage(
        'Abysius AI sends code snippets to remote servers. Please review our Privacy Policy and Terms.',
        'Open Privacy Policy',
        'Open Terms',
        'I Consent'
    );
    if (result === 'I Consent') {
        const config = vscode.workspace.getConfiguration('abysius');
        await config.update('privacyConsent', true, true);
    } else if (result === 'Open Privacy Policy') {
        vscode.env.openExternal(vscode.Uri.file('/workspace/PRIVACY.md'));
    } else if (result === 'Open Terms') {
        vscode.env.openExternal(vscode.Uri.file('/workspace/TERMS.md'));
    }
}

export function activate(context: vscode.ExtensionContext) {
    const config = vscode.workspace.getConfiguration('abysius');

    // Privacy consent gate: AI features require explicit opt-in
    const privacyConsent = config.get<boolean>('privacyConsent', false);
    if (!privacyConsent) {
        showPrivacyNotice(context);
        // Allow activation but gate AI calls until consent is granted
    }

    // 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'),
        dataResidency: config.get<'auto' | 'us' | 'eu' | 'asia'>('dataResidency', 'auto'),
        enableAuditLog: config.get<boolean>('enableAuditLog', true),
        geoBlockRestrictedRegions: config.get<boolean>('geoBlockRestrictedRegions', true),
        anonymizeFilePaths: config.get<boolean>('anonymizeFilePaths', true)
    });

    // 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'),
                    dataResidency: newConfig.get<'auto' | 'us' | 'eu' | 'asia'>('dataResidency', 'auto'),
                    enableAuditLog: newConfig.get<boolean>('enableAuditLog', true),
                    geoBlockRestrictedRegions: newConfig.get<boolean>('geoBlockRestrictedRegions', true),
                    anonymizeFilePaths: newConfig.get<boolean>('anonymizeFilePaths', true)
                });
            }
        })
    );

    // 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');
}
