using System.ComponentModel;
using Kompas.Mcp.Core;
using Kompas.Mcp.Core.Modeling;
using ModelContextProtocol.Server;

namespace Kompas.Mcp.Host.Tools;

/// <summary>Инструменты параметрики: переменные модели (создание, изменение, удаление).</summary>
[McpServerToolType]
public sealed class VariableTools(KompasSession session, VariableService variables)
{
    [McpServerTool(Name = "create_variable")]
    [Description("Создать переменную модели с начальным числовым значением value. note — комментарий. external=true — внешняя (доступна для управления из сборки). Имя должно быть уникальным. Примечание: переменная управляет геометрией только в параметрической модели (где размеры эскизов связаны с именами переменных); для моделей с литеральными размерами переменная просто хранится. Используйте list_variables для просмотра. Возвращает вычисленное значение.")]
    public async Task<string> CreateVariable(
        string name,
        [Description("Начальное числовое значение")] double value,
        [Description("Комментарий (необязательно)")] string? note = null,
        [Description("Внешняя переменная (управляема из сборки)")] bool external = false)
    {
        await session.ConnectAsync();
        var v = await variables.CreateVariableAsync(name, value, note, external);
        return $"Переменная '{name}' создана (значение {v}).";
    }

    [McpServerTool(Name = "set_variable")]
    [Description("Задать выражение существующей переменной: константа (например «30») или формула со ссылками на другие переменные (например «width*2+5»). Модель перестраивается, значение пересчитывается. Десятичный разделитель — точка. Примечание: изменит геометрию только в параметрической модели (где размеры эскизов связаны с именами переменных); для моделей с литеральными размерами значение пересчитается, но геометрия не изменится. Возвращает вычисленное значение.")]
    public async Task<string> SetVariable(
        string name,
        [Description("Выражение: число или формула (width*2+5)")] string expression)
    {
        await session.ConnectAsync();
        var v = await variables.SetVariableAsync(name, expression);
        return $"Переменная '{name}' = «{expression}» → {v}.";
    }

    [McpServerTool(Name = "delete_variable")]
    [Description("Удалить переменную модели по имени. Нельзя удалить переменную, на которую ссылаются другие (сначала удалите зависимые).")]
    public async Task<string> DeleteVariable(string name)
    {
        await session.ConnectAsync();
        await variables.DeleteVariableAsync(name);
        return $"Переменная '{name}' удалена.";
    }
}
