namespace CMSMicroservice.Application.ProductsCQ.Commands.BulkUpdateProductPrices;

public class BulkUpdateProductPricesCommandHandler : IRequestHandler<BulkUpdateProductPricesCommand, BulkUpdateProductPricesResponseDto>
{
    private readonly IApplicationDbContext _context;
    private readonly ILogger<BulkUpdateProductPricesCommandHandler> _logger;

    public BulkUpdateProductPricesCommandHandler(
        IApplicationDbContext context,
        ILogger<BulkUpdateProductPricesCommandHandler> logger)
    {
        _context = context;
        _logger = logger;
    }

    public async Task<BulkUpdateProductPricesResponseDto> Handle(BulkUpdateProductPricesCommand request, CancellationToken cancellationToken)
    {
        var response = new BulkUpdateProductPricesResponseDto();
        var productIds = request.Products.Select(p => p.ProductId).ToList();

        // دریافت محصولات از دیتابیس
        var products = await _context.Products
            .Where(p => productIds.Contains(p.Id))
            .ToListAsync(cancellationToken);

        var productDict = products.ToDictionary(p => p.Id);

        foreach (var update in request.Products)
        {
            try
            {
                if (!productDict.TryGetValue(update.ProductId, out var product))
                {
                    response.FailedCount++;
                    response.Errors.Add($"محصول با شناسه {update.ProductId} یافت نشد");
                    continue;
                }

                // به‌روزرسانی قیمت
                product.Price = update.NewPrice;

                // به‌روزرسانی تخفیف (اگر ارسال شده باشد)
                if (update.NewDiscount.HasValue)
                {
                    product.Discount = update.NewDiscount.Value;
                }

                // به‌روزرسانی تخفیف باشگاه (اگر ارسال شده باشد)
                if (update.NewClubDiscountPercent.HasValue)
                {
                    product.ClubDiscountPercent = update.NewClubDiscountPercent.Value;
                }

                response.UpdatedCount++;
                
                _logger.LogInformation(
                    "Product {ProductId} price updated to {NewPrice} (Discount: {Discount}%, ClubDiscount: {ClubDiscount}%)",
                    product.Id, product.Price, product.Discount, product.ClubDiscountPercent);
            }
            catch (Exception ex)
            {
                response.FailedCount++;
                response.Errors.Add($"خطا در به‌روزرسانی محصول {update.ProductId}: {ex.Message}");
                _logger.LogError(ex, "Error updating product {ProductId} price", update.ProductId);
            }
        }

        if (response.UpdatedCount > 0)
        {
            await _context.SaveChangesAsync(cancellationToken);
            _logger.LogInformation("Bulk price update completed: {UpdatedCount} succeeded, {FailedCount} failed", 
                response.UpdatedCount, response.FailedCount);
        }

        return response;
    }
}
