using System.Text.Json;

namespace SharpChat.EventStorage;

public class VirtualEventStorage : EventStorage {
    private readonly Dictionary<long, StoredEventInfo> Events = [];

    public void AddEvent(
        long id,
        string type,
        string channelName,
        string senderId,
        string senderName,
        ColourInheritable senderColour,
        int senderRank,
        string senderNick,
        UserPermissions senderPerms,
        object? data = null,
        StoredEventFlags flags = StoredEventFlags.None
    ) {
        Events.Add(
            id,
            new(
                id,
                type,
                long.TryParse(senderId, out long senderId64) && senderId64 > 0 
                    ? new User(
                        senderId,
                        senderName,
                        senderColour,
                        senderRank,
                        senderPerms,
                        senderNick
                    )
                    : null,
                DateTimeOffset.Now,
                null,
                channelName,
                JsonDocument.Parse(data == null ? "{}" : JsonSerializer.Serialize(data)),
                flags
            )
        );
    }

    public StoredEventInfo? GetEvent(long seqId) {
        return Events.TryGetValue(seqId, out StoredEventInfo? evt) ? evt : null;
    }

    public void RemoveEvent(StoredEventInfo evt) {
        ArgumentNullException.ThrowIfNull(evt);
        Events.Remove(evt.Id);
    }

    public IEnumerable<StoredEventInfo> GetChannelEventLog(string channelName, int amount = 20, int offset = 0) {
        IEnumerable<StoredEventInfo> subset = Events.Values.Where(ev => ev.ChannelName == channelName);

        int start = subset.Count() - offset - amount;
        if(start < 0) {
            amount += start;
            start = 0;
        }

        return [.. subset.Skip(start).Take(amount)];
    }
}