using Application.Common.Helpers;
using Microsoft.Extensions.Logging;

namespace Application.Game.Card.Write;

public record WriteCardCommand(long CardId, string Data) : IRequestWrapper<string>;

public class WriteCommandHandler : RequestHandlerBase<WriteCardCommand, string>
{
    private readonly ILogger<WriteCommandHandler> logger;

    public WriteCommandHandler(ICardDependencyAggregate aggregate, ILogger<WriteCommandHandler> logger) : base(aggregate)
    {
        this.logger = logger;
    }

    public override async Task<ServiceResult<string>> Handle(WriteCardCommand request, CancellationToken cancellationToken)
    {
        var dto = request.Data.DeserializeCardData<CardDto>();
        dto.CardId = request.CardId;

        var card = await CardDbContext.CardMains.FirstOrDefaultAsync(card => card.CardId == request.CardId, cancellationToken: cancellationToken);

        if (card is null)
        {
            logger.LogInformation("Creating new card {CardId}", request.CardId);
            card = dto.CardDtoToCardMain();
            card.Created = TimeHelper.CurrentTimeToString();
            card.Modified = TimeHelper.CurrentTimeToString();
            CardDbContext.CardMains.Add(card);
        }
        else
        {
            logger.LogInformation("Updating {CardId}", request.CardId);
            card.Fcol1 = dto.Fcol1;
            card.Fcol2 = dto.Fcol2;
            card.Fcol3 = dto.Fcol3;
            card.ScoreI1 = dto.ScoreI1;
            card.Modified = TimeHelper.CurrentTimeToString();
            CardDbContext.CardMains.Update(card);
        }

        await CardDbContext.SaveChangesAsync(cancellationToken);
        
        return new ServiceResult<string>(request.Data);
    }
}