import * as vscode from 'vscode';
import { FileModel, FileEntry } from './model';
import { FileProvider } from './provider';
import { FunctionExtractor } from './functionExtractor';

// 查找已打开的文档
function findExistingDocument(filePath: string): vscode.TextDocument | undefined {
    const documents = vscode.workspace.textDocuments;
    for (const doc of documents) {
        if (doc.uri.scheme === 'squirrel' && doc.uri.path === `/${filePath}`) {
            return doc;
        }
    }
    return undefined;
}

// 打开文件的通用函数
async function openFile(model: FileModel, provider: FileProvider, entry: FileEntry): Promise<void> {
    if (!model.getIsConnected()) {
        vscode.window.showErrorMessage('请先连接到 pvfUtility API');
        return;
    }

    // 检查是否已经有相同的文件打开
    const existingDocument = findExistingDocument(entry.key);
    if (existingDocument) {
        // 如果文件已打开，则聚焦到该标签页
        await vscode.window.showTextDocument(existingDocument);
        return;
    }

    // 如果文件未打开，则在新标签页中打开
    try {
        await vscode.window.withProgress({
            location: vscode.ProgressLocation.Notification,
            title: `正在加载文件 ${entry.name}...`,
            cancellable: false
        }, async (progress) => {
            const content = await model.getFileContent(entry.key);

            if (content !== undefined) {
                // 创建虚拟文档，使用时间戳确保URI唯一以支持多标签页
                const timestamp = Date.now();
                const uri = vscode.Uri.parse(`squirrel:/${entry.key}?instance=${timestamp}`);
                const doc = await vscode.workspace.openTextDocument(uri);
                await vscode.window.showTextDocument(doc, { preview: false });
                provider.refresh();
            } else {
                vscode.window.showErrorMessage(`加载文件 ${entry.name} 失败`);
            }
        });
    } catch (error) {
        vscode.window.showErrorMessage(`打开文件失败: ${error}`);
    }
}

export function registerCommands(context: vscode.ExtensionContext, model: FileModel, provider: FileProvider, functionExtractor: FunctionExtractor, output?: vscode.OutputChannel) {
    // 连接到 API
    console.log('注册 squirrel.connectToApi 命令...');
    const connectCommand = vscode.commands.registerCommand('squirrel.connectToApi', async () => {
        try {
            await vscode.window.withProgress({
                location: vscode.ProgressLocation.Notification,
                title: '正在连接到 pvfUtility API...',
                cancellable: false
            }, async (progress) => {
                const success = await model.connect();
                if (success) {
                    vscode.window.showInformationMessage('成功连接到 pvfUtility API');
                    provider.refresh();

                    // 连接成功后，自动提取所有文件中的函数信息
                    console.log('开始提取所有文件中的函数信息...');
                    await vscode.window.withProgress({
                        location: vscode.ProgressLocation.Notification,
                        title: '正在提取函数信息...',
                        cancellable: false
                    }, async (progress) => {
                        await functionExtractor.extractAllFunctions(model);
                        vscode.window.showInformationMessage('函数信息提取完成');
                    });
                } else {
                    vscode.window.showErrorMessage('连接到 pvfUtility API 失败');
                }
            });
        } catch (error) {
            vscode.window.showErrorMessage(`连接失败: ${error}`);
        }
    });

    // 打开文件（单击或双击文件时调用）
    const openFileCommand = vscode.commands.registerCommand('squirrel.openFile', async (entry: FileEntry) => {
        await openFile(model, provider, entry);
    });

    // 打开库函数文档文件夹
    const openApiDocsCommand = vscode.commands.registerCommand('squirrel.openApiDocs', async () => {
        // 获取扩展路径
        const extensionPath = vscode.extensions.getExtension('local.squirrel-nut-explorer')?.extensionPath;
        if (extensionPath) {
            // 构建api-functions.json文件的URI
            const apiDocsUri = vscode.Uri.file(extensionPath);
            // 在资源管理器中打开文件夹
            await vscode.env.openExternal(apiDocsUri);
        } else {
            vscode.window.showErrorMessage('无法找到扩展路径');
        }
    });

    context.subscriptions.push(connectCommand, openFileCommand, openApiDocsCommand);
}