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,
            long senderId,
            string senderName,
            Colour senderColour,
            int senderRank,
            string senderNick,
            UserPermissions 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 User(
                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)];
        }
    }
}