using System.Text.Json;

namespace SharpChat.Messages;

public class VirtualMessageStorage : MessageStorage {
    private readonly Dictionary<long, Message> Messages = [];

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

        return Task.CompletedTask;
    }

    public Task<Message?> GetMessage(long seqId) {
        return Task.FromResult(Messages.TryGetValue(seqId, out Message? evt) ? evt : null);
    }

    public Task DeleteMessage(Message evt) {
        Messages.Remove(evt.Id);
        return Task.CompletedTask;
    }

    public Task<IEnumerable<Message>> GetMessages(string channelName, int amount = 20, int offset = 0) {
        IEnumerable<Message> subset = Messages.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<Message>);
    }
}