using System.Globalization;

namespace Kompas.Mcp.Core.Modeling;

/// <summary>
/// Метрики построенной надписи. Агенту нужны ДВЕ разные величины, и путать их дорого:
/// <list type="bullet">
/// <item><description><b>Габарит глифов</b> — прямоугольник, реально занятый буквами. По нему
/// выравнивают надпись и вписывают её в поле; только он совпадает с тем, что получится после
/// выдавливания.</description></item>
/// <item><description><b>Ширина ячейки</b> (<c>ksGetTextLengthFromReference</c>) — шаг строки
/// с боковыми выносами. Больше габарита на 1–2 % у наборных шрифтов и на 7–9 % у скриптовых.</description></item>
/// </list>
/// Пока в ответе была только ячейка, подгонка надписи под размер шла вслепую: вставить →
/// выдавить → замерить → пересобрать документ.
/// </summary>
/// <param name="Advance">Ширина ячейки строки, мм.</param>
/// <param name="Box">Габарит глифов в координатах эскиза (мм) или <c>null</c>, если КОМПАС его не отдал.</param>
public readonly record struct TextMetrics(
    double Advance,
    (double MinX, double MinY, double MaxX, double MaxY)? Box)
{
    /// <summary>Заметка для ответа инструмента: где легли буквы и сколько заняли.</summary>
    public string Describe(string? text)
    {
        var what = string.IsNullOrEmpty(text) ? "надпись" : $"надпись «{text}»";
        var cell = F(Advance);
        if (Box is not { } b)
            return $"{what} — ширина ячейки {cell} мм (габарит глифов КОМПАС не отдал)";

        var width = F(b.MaxX - b.MinX);
        var height = F(b.MaxY - b.MinY);
        return $"{what} — глифы X {F(b.MinX)}…{F(b.MaxX)}, Y {F(b.MinY)}…{F(b.MaxY)} " +
               $"({width} × {height} мм), ширина ячейки {cell} мм";
    }

    private static string F(double value) => value.ToString("F2", CultureInfo.InvariantCulture);
}
