using Avalonia.Controls;
using Avalonia.Controls.Templates;
using ClawdDotNet.Desktop.ViewModels;

namespace ClawdDotNet.Desktop;

/// <summary>
/// Findet zu einem Ansichtsmodell die passende Ansicht über die Namenskonvention
/// <c>…ViewModels.FooViewModel</c> → <c>…Views.FooView</c>.
///
/// Das erspart es, jede Zuordnung von Hand als <c>DataTemplate</c> einzutragen — bei
/// den sieben Bereichen und ihren Unteransichten wären das schnell dreißig Einträge,
/// die man beim Umbenennen übersieht.
///
/// Passt nichts, erscheint der gesuchte Typname im Fenster statt einer leeren Fläche.
/// Beim schrittweisen Umbau ist eine sichtbare Fehlstelle mehr wert als ein stiller
/// weißer Bereich.
/// </summary>
public sealed class ViewLocator : IDataTemplate
{
    public Control Build(object? data)
    {
        if (data is null)
            return new TextBlock { Text = "(kein Inhalt)" };

        var viewModelName = data.GetType().FullName!;
        var viewName = viewModelName
            .Replace(".ViewModels.", ".Views.", StringComparison.Ordinal)
            .Replace("ViewModel", "View", StringComparison.Ordinal);

        var type = Type.GetType(viewName);

        if (type is null)
            return new TextBlock { Text = $"Ansicht nicht gefunden: {viewName}" };

        return (Control)Activator.CreateInstance(type)!;
    }

    public bool Match(object? data) => data is ViewModelBase;
}
