using CMSMicroservice.Application.Common.Interfaces;
using MediatR;
using Microsoft.EntityFrameworkCore;

namespace CMSMicroservice.Application.DiscountShopCQ.Commands.UpdateCartItemCount;

public class UpdateCartItemCountCommandHandler : IRequestHandler<UpdateCartItemCountCommand, UpdateCartItemCountResponseDto>
{
    private readonly IApplicationDbContext _context;

    public UpdateCartItemCountCommandHandler(IApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<UpdateCartItemCountResponseDto> Handle(UpdateCartItemCountCommand request, CancellationToken cancellationToken)
    {
        // پیدا کردن آیتم سبد خرید
        var cartItem = await _context.DiscountShoppingCarts
            .Include(c => c.Product)
            .FirstOrDefaultAsync(c => c.UserId == request.UserId && c.ProductId == request.ProductId, cancellationToken);

        if (cartItem == null)
        {
            return new UpdateCartItemCountResponseDto
            {
                Success = false,
                Message = "آیتم در سبد خرید یافت نشد"
            };
        }

        // بررسی موجودی محصول
        if (request.NewCount > cartItem.Product.RemainingCount)
        {
            return new UpdateCartItemCountResponseDto
            {
                Success = false,
                Message = $"موجودی محصول کافی نیست. موجودی فعلی: {cartItem.Product.RemainingCount}"
            };
        }

        // اگر تعداد جدید صفر یا منفی باشد، آیتم را حذف کن
        if (request.NewCount <= 0)
        {
            _context.DiscountShoppingCarts.Remove(cartItem);
            await _context.SaveChangesAsync(cancellationToken);

            return new UpdateCartItemCountResponseDto
            {
                Success = true,
                Message = "محصول از سبد خرید حذف شد"
            };
        }

        // به‌روزرسانی تعداد
        cartItem.Count = request.NewCount;
        await _context.SaveChangesAsync(cancellationToken);

        return new UpdateCartItemCountResponseDto
        {
            Success = true,
            Message = "تعداد محصول به‌روزرسانی شد"
        };
    }
}
