import * as monaco from "monaco-editor-core"
// import { WorkerAccessor } from "../types"

export default class HoverProvider implements monaco.languages.HoverProvider {

    // constructor(private worker: WorkerAccessor) { }
    constructor() { }

    async provideHover(model: monaco.editor.ITextModel, position: monaco.Position): Promise<monaco.languages.Hover | null> {
        const word = model.getWordAtPosition(position);
        if (!word) return null;

        const hoverInfo = this.getHoverInfo(word.word);
        if (!hoverInfo) return null;

        return {
            contents: [
                { value: hoverInfo }
            ],
            range: {
                startLineNumber: position.lineNumber,
                startColumn: word.startColumn,
                endLineNumber: position.lineNumber,
                endColumn: word.endColumn
            }
        };
    }

    private getHoverInfo(word: string): string | null {
        const hoverMap: { [key: string]: string } = {
            // 量子门
            'h': '**Hadamard门 (H Gate)**\n\n将量子比特置于叠加态。将|0⟩转换为|+⟩，将|1⟩转换为|-⟩。',
            'x': '**Pauli-X门**\n\n量子比特的"非"门，将|0⟩转换为|1⟩，将|1⟩转换为|0⟩。',
            'y': '**Pauli-Y门**\n\n在布洛赫球上绕y轴旋转π弧度。',
            'z': '**Pauli-Z门**\n\n在布洛赫球上绕z轴旋转π弧度。',
            'cx': '**CNOT门 (Controlled-X)**\n\n双量子比特门，如果控制位为|1⟩，则对目标位执行X门操作。',
            'ccx': '**Toffoli门 (CCNOT)**\n\n三量子比特门，如果两个控制位都为|1⟩，则对目标位执行X门操作。',

            // 关键字
            'OPENQASM': '**OpenQASM**\n\n量子汇编语言版本声明。',
            'include': '**Include指令**\n\n包含其他量子程序文件。',
            'qreg': '**量子寄存器声明**\n\n声明一个量子比特寄存器。',
            'creg': '**经典寄存器声明**\n\n声明一个经典比特寄存器。',
            'measure': '**测量操作**\n\n对量子比特进行测量，并将结果存储在经典寄存器中。',
            'barrier': '**屏障指令**\n\n防止编译器对指定的量子比特进行优化重排。'
        };

        return hoverMap[word] || null;
    }

}