using System.Collections.ObjectModel;
using System.Windows.Media;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Livia.Utility;
using Microsoft.Extensions.Logging;

namespace Livia.Models;

public class LegendItem
{
    public string ItemFullName { get; init; } = string.Empty;
    public string ItemName { get; init; } = string.Empty;
    public Color ItemColor { get; init; }
}

public interface IRoiLegendManager
{
    void Clear();
    void AddItem(int tabKey, string id, string name, string fullName, Color color);
}

public class RoiLegendManager : ObservableRecipient, IRoiLegendManager, IRecipient<RoiTabChangedMessage>
{
    public ObservableCollection<LegendItem> LegendItems { get; } = [];
    private Dictionary<int, List<LegendItem>> LegendItemsDict { get; } = new();

    private readonly HashSet<string> _currentItems = [];
    private readonly ILogger _logger;

    public RoiLegendManager(ILogger logger)
    {
        _logger = logger;
        WeakReferenceMessenger.Default.RegisterAll(this);
    }

    public void Clear()
    {
        LegendItems.Clear();
        LegendItemsDict.Clear();
        _currentItems.Clear();
    }

    public void AddItem(int tabKey, string id, string name, string fullName, Color color)
    {
        string hashKey = $"{tabKey}###{id}";
        if (!_currentItems.Add(hashKey))
            return;

        LegendItem item = new()
        {
            ItemName = LiviaUtility.ParseServerString(name),
            ItemFullName = LiviaUtility.ParseServerString(fullName),
            ItemColor = color
        };
        LegendItemsDict.AddToCollectionWithKey(tabKey, item);
    }

    public void Receive(RoiTabChangedMessage message)
    {
        if (LegendItemsDict.TryGetValue(message.Value, out List<LegendItem>? list))
        {
            LegendItems.Clear();
            LegendItems.AddRange(list);
        }
        else
        {
            _logger.LogWarning("Unknown Roi tab index for legends: {id}", message.Value);
        }
    }
}