using System.Security.Claims;
using adas_core.Application.Services.Interfaces;
using audit_logs.Services.Interfaces;
using Microsoft.Extensions.Logging;

namespace adas_core.Application.Services;

public class LocalAuditService(
    IAuditService auditService,
    ILogger<LocalAuditService> logger)
    : ILocalAuditService
{
    public async Task CreateAuditLogAsync(ClaimsPrincipal? user, object? dataOriginal, object? dataModified,
        string? reason)
    {
        try
        {
            if (reason != null)
            {
                await auditService.CreateAuditLogAsync(user, dataOriginal!, dataModified!, reason);
            }
            else
            {
                _ = user?.FindFirst(ClaimTypes.Name)?.Value ?? "Not specified";

                await auditService.CreateAuditLogAsync(user, dataOriginal!, dataModified!);
            }
        }
        catch (Exception ex)
        {
            logger.LogError(ex.Message);
        }
    }

    public async Task<T?> DeepCopyAsync<T>(T data)
    {
        try
        {
            return await auditService.DeepCopyAsync(data);
        }
        catch (Exception ex)
        {
            logger.LogWarning("Error copying object, trying with JsonDeepCopyAsync. Exception: {Message}", ex.Message);
            try
            {
                var copy = await auditService.JsonDeepCopyAsync(data);
                return copy;
            }
            catch (Exception e)
            {
                logger.LogError(e, "Error in fallback copy method. Exception: {Message}", e.Message);
                return default;
            }
        }
    }
}