using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;

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

        public void AddEvent(
            long id, string type,
            string channelName,
            long senderId, string senderName, ChatColour senderColour, int senderRank, string senderNick, ChatUserPermissions senderPerms,
            object data = null,
            StoredEventFlags flags = StoredEventFlags.None
        ) {
            ArgumentNullException.ThrowIfNull(type);

            // VES is meant as an emergency fallback but this is something else
            JsonDocument hack = JsonDocument.Parse(data == null ? "{}" : JsonSerializer.Serialize(data));
            Events.Add(id, new(id, type, senderId < 1 ? null : new ChatUser(
                senderId,
                senderName,
                senderColour,
                senderRank,
                senderPerms,
                senderNick
            ), DateTimeOffset.Now, null, channelName, hack, 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)];
        }
    }
}