using System.Globalization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Data.Converters;
using Avalonia.Media;

namespace ClawdDotNet.Desktop.Converters;

/// <summary>
/// Schlägt eine Symbol-Geometrie aus <c>Styles/Icons.axaml</c> über ihren Namen nach.
///
/// <para>Damit halten die Ansichtsmodelle nur den Namen („IconChat") statt einer
/// <see cref="Geometry"/> — sie brauchen dann keinen Verweis auf <c>Avalonia.Media</c>,
/// und die Navigationsleiste kommt mit einer schlichten Zeichenkette je Eintrag aus.</para>
///
/// <para>Dass hier keine Themenumschaltung nötig ist, ist kein Zufall: Die Geometrien sind
/// themenunabhängig, gefärbt wird erst beim Zeichnen über die geerbte Vordergrundfarbe
/// (siehe <c>Controls/StrokeIcon.cs</c>). Für Farben wäre dieser Weg falsch — ein einmal
/// aufgelöster Pinsel bliebe beim Wechsel auf Dunkel stehen.</para>
/// </summary>
public sealed class IconConverter : IValueConverter
{
    public static readonly IconConverter Instance = new();

    public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
    {
        if (value is not string key || string.IsNullOrEmpty(key)) return null;
        if (Application.Current is not { } app) return null;

        return app.TryFindResource(key, out var resource) ? resource as Geometry : null;
    }

    public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
        => throw new NotSupportedException("Nur zur Anzeige.");
}

/// <summary>
/// Der Pfeil am Einklapp-Schalter der Seitenleiste: zeigt nach links, solange
/// eingeklappt werden kann, und nach rechts, wenn wieder aufgeklappt wird.
/// </summary>
public sealed class SidebarChevronConverter : IValueConverter
{
    public static readonly SidebarChevronConverter Instance = new();

    public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
    {
        var isCollapsed = value is true;
        return IconConverter.Instance.Convert(
            isCollapsed ? "IconChevronRight" : "IconChevronLeft", targetType, parameter, culture);
    }

    public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
        => throw new NotSupportedException("Nur zur Anzeige.");
}
