using System.Runtime.InteropServices;

namespace Kompas.Mcp.Core.Interop;

/// <summary>
/// Вспомогательные методы для работы с COM RCW: безопасное освобождение
/// и safe-геттеры для свойств, которые могут бросить исключение.
/// <para>
/// Метод <see cref="Release"/> идентично реализован в каждом сервисе — вынесен сюда.
/// Safe-геттеры заменяют разрозненные <c>SafeStr</c>/<c>SafeGet</c>/<c>SafeBool</c>/<c>SafeNum</c>.
/// </para>
/// </summary>
internal static class ComHelper
{
    /// <summary>Освободить COM RCW: null-гард + IsComObject-проверка + try/catch.</summary>
    internal static void Release(object? com)
    {
        if (com is not null && Marshal.IsComObject(com))
            try { Marshal.ReleaseComObject(com); } catch { }
    }

    /// <summary>Безопасно получить строку: возвращает <c>""</c> при любом исключении.</summary>
    internal static string SafeStr(Func<string?> f) { try { return f() ?? ""; } catch { return ""; } }

    /// <summary>Безопасно получить число: возвращает <c>0</c> при любом исключении.</summary>
    internal static double SafeNum(Func<double> f) { try { return f(); } catch { return 0; } }

    /// <summary>Безопасно получить флаг: возвращает <c>false</c> при любом исключении.</summary>
    internal static bool SafeBool(Func<bool> f) { try { return f(); } catch { return false; } }
}
