using System.Text.Json;

namespace SharpChat.EventStorage;

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

    public Task 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
            )
        );

        return Task.CompletedTask;
    }

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

    public Task RemoveEvent(StoredEventInfo evt) {
        Events.Remove(evt.Id);
        return Task.CompletedTask;
    }

    public Task<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 Task.FromResult(subset.Skip(start).Take(amount).ToArray() as IEnumerable<StoredEventInfo>);
    }
}