using System.ComponentModel;
using Kompas.Mcp.Core;
using Kompas.Mcp.Core.Interop;
using Kompas.Mcp.Core.Validation;
using ModelContextProtocol.Server;

namespace Kompas.Mcp.Host.Tools;

/// <summary>Системные инструменты: подключение, статус, видимость окна.</summary>
[McpServerToolType]
public sealed class SystemTools(KompasSession session, AutoValidation autoValidation)
{
    [McpServerTool(Name = "kompas_connect")]
    [Description("Подключиться к КОМПАС-3D: присоединиться к запущенному экземпляру или запустить новый, показать окно. Возвращает версию и редакцию.")]
    public async Task<string> Connect()
    {
        var info = await session.ConnectAsync();
        return $"Подключено к КОМПАС {info.Version} (build {info.BuildNumber}, {info.Edition}), ProgID {info.ProgId}.";
    }

    [McpServerTool(Name = "kompas_status")]
    [Description("Текущее состояние подключения к КОМПАС.")]
    public string Status()
    {
        // Проверка интеропа идёт до любого обращения к сессии: без сборок КОМПАС первое же
        // касание её свойств бросит FileLoadException, а MCP SDK покажет агенту только
        // «An error occurred invoking …» без причины. Здесь причина попадает прямо в ответ —
        // на этот инструмент опирается /kompas:doctor.
        try
        {
            KompasInteropLoader.ResolveDirectory();
        }
        catch (KompasInteropException ex)
        {
            return "Сервер не может обратиться к КОМПАС. " + ex.Message;
        }

        var validation = autoValidation.Enabled
            ? "Авто-валидация включена: операции сами дописывают итог проверки построения."
            : "Авто-валидация выключена: проверяйте построение вызовом validate_part.";

        return (session.IsConnected && session.LastInfo is { } i
            ? $"Подключено: КОМПАС {i.Version} ({i.Edition})."
            : "Не подключено. Вызовите kompas_connect.") + " " + validation;
    }

    [McpServerTool(Name = "set_auto_validate")]
    [Description("Включить или выключить авто-валидацию: дописывать ли к ответу каждой мутирующей операции " +
                 "(выдавливание, вращение, скругление, отверстие, массив, прямое редактирование…) итог проверки " +
                 "построения. Включена по умолчанию — отдельный validate_part тогда не нужен. Выключайте только " +
                 "если проверка после каждого шага заметно замедляет работу на тяжёлой модели; тогда зовите " +
                 "validate_part вручную перед выдачей результата и экспортом.")]
    public string SetAutoValidate([Description("true — включить, false — выключить")] bool enabled)
    {
        autoValidation.Enabled = enabled;
        return enabled
            ? "Авто-валидация включена: итог проверки построения дописывается к ответу каждой операции."
            : "Авто-валидация выключена: проверяйте построение вызовом validate_part вручную.";
    }

    [McpServerTool(Name = "kompas_set_visible")]
    [Description("Показать или скрыть главное окно КОМПАС.")]
    public async Task<string> SetVisible([Description("true — показать, false — скрыть")] bool visible)
    {
        await session.ConnectAsync();
        await session.SetVisibleAsync(visible);
        return visible ? "Окно КОМПАС показано." : "Окно КОМПАС скрыто.";
    }
}
