using System.Collections.ObjectModel;
using ClawdDotNet.App;
using CommunityToolkit.Mvvm.ComponentModel;

namespace ClawdDotNet.Desktop.ViewModels;

/// <summary>Eine Nachricht zwischen zwei Agenten.</summary>
public sealed class AgentMessageItem
{
    public required string SenderName { get; init; }
    public required string Text { get; init; }
    public required DateTime Time { get; init; }

    /// <summary>Links steht Agent A, rechts Agent B — wie im Chat mit dem Benutzer.</summary>
    public required bool IsFromAgentA { get; init; }
}

/// <summary>Ein Agent in den beiden Auswahlfeldern.</summary>
public sealed record AgentChoice(string AgentId, string DisplayName)
{
    public override string ToString() => DisplayName;
}

/// <summary>
/// Verlauf der Nachrichten zwischen zwei Agenten.
///
/// <para><strong>Ohne Datenbestand.</strong> Agenten können sich heute schon Nachrichten
/// schicken — <c>AgentEngine.SendMessageAsync</c> stellt zu, aber nichts schreibt den
/// Wortlaut mit. Der Speicher <c>AgentMessages</c> aus
/// <c>docs/Agentenkommunikation-Konzept.md</c> ist noch nicht gebaut.</para>
///
/// <para>Die Seite steht trotzdem vollständig da: Auswahl, Filterung und Darstellung sind
/// fertig, und wenn der Speicher kommt, ist hier genau eine Abfrage zu ergänzen —
/// <see cref="LoadMessages"/>. Bis dahin erklärt die Seite ihren Leerzustand, statt als
/// leerer Kasten dazustehen.</para>
/// </summary>
public sealed partial class AgentChatsPageViewModel : PageViewModel
{
    public ObservableCollection<AgentChoice> Agents { get; } = [];
    public ObservableCollection<AgentMessageItem> Messages { get; } = [];

    [ObservableProperty]
    private AgentChoice? _agentA;

    [ObservableProperty]
    private AgentChoice? _agentB;

    [ObservableProperty]
    private bool _isEmpty = true;

    [ObservableProperty]
    private string _emptyText = "";

    public AgentChatsPageViewModel() : this(null) { }

    public AgentChatsPageViewModel(AppHost? host) : base("Agenten-Chats")
    {
        if (host is null)
        {
            Agents.Add(new AgentChoice("dev-assistant", "Dev Assistant"));
            Agents.Add(new AgentChoice("social-media", "Social Media Manager"));
        }
        else
        {
            foreach (var agent in host.Instance.Agents)
                Agents.Add(new AgentChoice(agent.AgentId, agent.DisplayName));
        }

        AgentA = Agents.FirstOrDefault();
        AgentB = Agents.Skip(1).FirstOrDefault() ?? AgentA;

        LoadMessages();
    }

    partial void OnAgentAChanged(AgentChoice? value) => LoadMessages();
    partial void OnAgentBChanged(AgentChoice? value) => LoadMessages();

    /// <summary>
    /// Hier kommt die Abfrage hin, sobald der <c>AgentMessages</c>-Speicher steht: alle
    /// Nachrichten zwischen <see cref="AgentA"/> und <see cref="AgentB"/> in beiden
    /// Richtungen, nach Zeit sortiert.
    /// </summary>
    private void LoadMessages()
    {
        Messages.Clear();

        EmptyText = Agents.Count < 2
            ? "Für einen Verlauf braucht es mindestens zwei Agenten in dieser Instanz."
            : "Noch keine Nachrichten aufgezeichnet. Agenten können sich bereits gegenseitig "
              + "erreichen; mitgeschrieben wird der Wortlaut erst, wenn der Nachrichtenspeicher "
              + "aus docs/Agentenkommunikation-Konzept.md steht.";

        IsEmpty = Messages.Count == 0;
    }
}
