// Copyright (C) 2026 Hudson River Trading LLC <opensource@hudson-trading.com>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

import type {McpServer} from '@modelcontextprotocol/sdk/server/mcp.js';

import type {ApiHandler} from '../../handlers/api.js';

export function registerLanguagesTool(server: McpServer, apiHandler: ApiHandler): void {
    server.tool(
        'list_languages',
        'List supported languages. Each entry has `defaultCompiler` and `compilerCount`.',
        {
            title: 'List languages',
            readOnlyHint: true,
            openWorldHint: false,
        },
        async () => {
            const languages = apiHandler.getAvailableLanguages();
            // One pass over compilers gives us the per-language count without an N×M scan.
            const countByLang = new Map<string, number>();
            for (const c of apiHandler.compilers) {
                countByLang.set(c.lang, (countByLang.get(c.lang) ?? 0) + 1);
            }
            const result = languages.map(lang => ({
                id: lang.id,
                name: lang.name,
                extensions: lang.extensions,
                defaultCompiler: lang.defaultCompiler,
                compilerCount: countByLang.get(lang.id) ?? 0,
            }));
            return {content: [{type: 'text', text: JSON.stringify(result, null, 2)}]};
        },
    );
}
