namespace Kompas.Mcp.Core.Documents;

/// <summary>
/// Подготовка пути, по которому мы собираемся ЧТО-ТО ЗАПИСАТЬ (документ, STEP, снимок).
/// <para>КОМПАС каталогов не создаёт: <c>SaveAs</c> в несуществующую папку просто ничего не пишет
/// и молчит, а <c>ConvertToAdditionFormat</c> возвращает FALSE без причины. Агент в этот момент
/// думает, что имя файла занято, и уходит чинить не то. Поэтому каталог создаём сами, а путь
/// приводим к абсолютному — относительный КОМПАС трактует от своего рабочего каталога,
/// а не от каталога агента.</para>
/// </summary>
public static class OutputPath
{
    /// <summary>
    /// Привести путь к абсолютному и создать каталог назначения. Возвращает полный путь.
    /// </summary>
    /// <param name="path">Путь к файлу (абсолютный или относительный).</param>
    /// <param name="parameterName">Имя параметра инструмента — попадёт в текст ошибки.</param>
    public static string Prepare(string? path, string parameterName = "path")
    {
        if (string.IsNullOrWhiteSpace(path))
            throw new ArgumentException("Путь к файлу не задан.", parameterName);

        string full;
        try
        {
            full = Path.GetFullPath(path);
        }
        catch (Exception ex) when (ex is ArgumentException or NotSupportedException or PathTooLongException)
        {
            throw new ArgumentException($"Некорректный путь «{path}»: {ex.Message}", parameterName, ex);
        }

        if (Path.GetFileName(full).Length == 0)
            throw new ArgumentException($"Путь «{path}» указывает на каталог, а не на файл.", parameterName);

        var directory = Path.GetDirectoryName(full);
        if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
        {
            try
            {
                Directory.CreateDirectory(directory);
            }
            catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or NotSupportedException)
            {
                throw new InvalidOperationException(
                    $"Каталог «{directory}» не существует и не создаётся: {ex.Message}", ex);
            }
        }

        return full;
    }
}
