/**
 * Monaco-LaTeX: LaTeX language support for Monaco Editor.
 *
 * This package provides:
 * - Syntax highlighting (Monarch tokenizer)
 * - Autocompletion for commands, environments, and packages
 * - Hover documentation
 * - Code folding for environments and sections
 */
import type * as Monaco from 'monaco-editor';
import type { languages } from 'monaco-editor';

// Import for internal use
import { createCompletionProvider } from './src/completion';
import { createFoldingProvider } from './src/folding';
import { createHoverProvider } from './src/hover';
import { monarchTokenizer } from './src/tokenizer';

// Re-export the tokenizer
export { default, monarchTokenizer } from './src/tokenizer';

// Re-export providers
export { createCompletionProvider, LaTeXCompletionProvider } from './src/completion';
export { createFoldingProvider, LaTeXFoldingRangeProvider } from './src/folding';
export { createHoverProvider, LaTeXHoverProvider } from './src/hover';

// Re-export command data for advanced usage
export {
    COMMAND_MAP, CommandCategory, ENVIRONMENT_MAP, LATEX_COMMANDS,
    LATEX_ENVIRONMENTS,
    LATEX_PACKAGES, PACKAGE_MAP, type LaTeXCommand,
    type LaTeXEnvironment,
    type LaTeXPackage
} from './src/commands/data';

/**
 * Language configuration for LaTeX.
 */
export const languageConfiguration: languages.LanguageConfiguration = {
    comments: {
        lineComment: '%',
    },
    brackets: [
        ['{', '}'],
        ['[', ']'],
        ['(', ')'],
    ],
    autoClosingPairs: [
        { open: '{', close: '}' },
        { open: '[', close: ']' },
        { open: '(', close: ')' },
        { open: '$', close: '$' },
    ],
    surroundingPairs: [
        { open: '{', close: '}' },
        { open: '[', close: ']' },
        { open: '(', close: ')' },
        { open: '$', close: '$' },
    ],
    folding: {
        markers: {
            start: /\\begin\{/,
            end: /\\end\{/,
        },
    },
};

/**
 * Registers all LaTeX language features with Monaco.
 * This is a convenience function that sets up everything at once.
 *
 * @param monaco - The Monaco editor instance
 */
export function registerLaTeXLanguage(monaco: typeof Monaco): void {
    // Register the language
    monaco.languages.register({
        id: 'latex',
        extensions: ['.tex', '.sty', '.cls'],
        aliases: ['LaTeX', 'latex', 'tex'],
        mimetypes: ['text/latex', 'text/tex'],
    });

    // Set language configuration
    monaco.languages.setLanguageConfiguration('latex', languageConfiguration);

    // Set tokenizer for syntax highlighting
    monaco.languages.setMonarchTokensProvider('latex', monarchTokenizer);

    // Register completion provider
    monaco.languages.registerCompletionItemProvider('latex', createCompletionProvider(monaco));

    // Register hover provider
    monaco.languages.registerHoverProvider('latex', createHoverProvider(monaco));

    // Register folding provider
    monaco.languages.registerFoldingRangeProvider('latex', createFoldingProvider(monaco));
}
