using CMSMicroservice.Application.Common.Interfaces;

namespace CMSMicroservice.Application.UserOrderCQ.Commands.ApplyDiscountToOrder;

public class ApplyDiscountToOrderCommandHandler : IRequestHandler<ApplyDiscountToOrderCommand, ApplyDiscountToOrderResponseDto>
{
    private readonly IApplicationDbContext _context;
    private readonly ILogger<ApplyDiscountToOrderCommandHandler> _logger;

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

    public async Task<ApplyDiscountToOrderResponseDto> Handle(ApplyDiscountToOrderCommand request, CancellationToken cancellationToken)
    {
        // TODO: پیاده‌سازی اعمال تخفیف به سفارش
        // 1. پیدا کردن سفارش:
        //    - var order = await _context.UserOrders.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken)
        //    - بررسی null و پرتاب NotFoundException
        //
        // 2. بررسی شرایط اعمال تخفیف:
        //    - سفارش نباید Delivered یا Cancelled باشد
        //    - مبلغ تخفیف نباید بیشتر از Amount باشد
        //    - if (order.DeliveryStatus == DeliveryStatus.Delivered || order.DeliveryStatus == DeliveryStatus.Cancelled)
        //        throw new InvalidOperationException("نمی‌توان به این سفارش تخفیف اعمال کرد")
        //    - if (request.DiscountAmount > order.Amount)
        //        throw new InvalidOperationException("مبلغ تخفیف نمی‌تواند بیشتر از مبلغ سفارش باشد")
        //
        // 3. محاسبه مبلغ نهایی:
        //    - var originalAmount = order.Amount
        //    - var newDiscountedPrice = order.Amount - request.DiscountAmount
        //    - مطمئن شوید که منفی نشود: newDiscountedPrice = Math.Max(0, newDiscountedPrice)
        //
        // 4. به‌روزرسانی سفارش:
        //    - order.DiscountedPrice = newDiscountedPrice
        //    - اگر فیلد OrderDiscountAmount وجود دارد، آن را هم به‌روز کنید
        //    - order.OrderDiscountAmount = request.DiscountAmount
        //    - اضافه کردن به توضیحات:
        //      order.DeliveryDescription = (order.DeliveryDescription ?? "") + 
        //        $"\nتخفیف اعمال شده: {request.DiscountAmount} ریال - دلیل: {request.Reason}"
        //
        // 5. ذخیره Log تخفیف (اختیاری - اگر جدول OrderDiscountLog دارید):
        //    - var discountLog = new OrderDiscountLog {
        //        OrderId = order.Id,
        //        DiscountAmount = request.DiscountAmount,
        //        Reason = request.Reason,
        //        DiscountCode = request.DiscountCode,
        //        AppliedAt = DateTime.UtcNow
        //      }
        //    - await _context.OrderDiscountLogs.AddAsync(discountLog, cancellationToken)
        //
        // 6. ذخیره و Log:
        //    - await _context.SaveChangesAsync(cancellationToken)
        //    - _logger.LogInformation("Discount {Amount} applied to order {OrderId}: {Reason}", 
        //        request.DiscountAmount, request.OrderId, request.Reason)
        //
        // 7. برگشت Response:
        //    - return new ApplyDiscountToOrderResponseDto {
        //        Success = true,
        //        Message = "تخفیف با موفقیت اعمال شد",
        //        OriginalAmount = originalAmount,
        //        DiscountAmount = request.DiscountAmount,
        //        FinalAmount = newDiscountedPrice
        //      }
        //
        // نکته: این تخفیف برای تخفیفات دستی Admin است و جدا از تخفیف‌های محصول

        throw new NotImplementedException("ApplyDiscountToOrder needs implementation");
    }
}
