using DysonNetwork.Shared.Cache;
using DysonNetwork.Shared.GeoIp;

namespace DysonNetwork.Pass.Account;

public class ActionLogService(GeoIpService geo, FlushBufferService fbs)
{
    public void CreateActionLog(Guid accountId, string action, Dictionary<string, object?> meta)
    {
        var log = new ActionLog
        {
            Action = action,
            AccountId = accountId,
            Meta = meta,
        };

        fbs.Enqueue(log);
    }

    public void CreateActionLogFromRequest(string action, Dictionary<string, object> meta, HttpRequest request,
        Account? account = null)
    {
        var log = new ActionLog
        {
            Action = action,
            Meta = meta,
            UserAgent = request.Headers.UserAgent,
            IpAddress = request.HttpContext.Connection.RemoteIpAddress?.ToString(),
            Location = geo.GetPointFromIp(request.HttpContext.Connection.RemoteIpAddress?.ToString())
        };
        
        if (request.HttpContext.Items["CurrentUser"] is Account currentUser)
            log.AccountId = currentUser.Id;
        else if (account != null)
            log.AccountId = account.Id;
        else
            throw new ArgumentException("No user context was found");
        
        if (request.HttpContext.Items["CurrentSession"] is Auth.AuthSession currentSession)
            log.SessionId = currentSession.Id;

        fbs.Enqueue(log);
    }
}