using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Domain.Entities;
using Microsoft.EntityFrameworkCore;

namespace CMSMicroservice.Application.UserCartsCQ.Commands.MergeCart;

public class MergeCartCommandHandler : IRequestHandler<MergeCartCommand, MergeCartResponseDto>
{
    private readonly IApplicationDbContext _context;

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

    public async Task<MergeCartResponseDto> Handle(MergeCartCommand request, CancellationToken cancellationToken)
    {
        // بررسی وجود کاربر
        var user = await _context.Users
            .FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);
        
        if (user == null)
        {
            return new MergeCartResponseDto
            {
                Success = false,
                Message = "کاربر یافت نشد"
            };
        }

        // دریافت سبد فعلی کاربر
        var existingCartItems = await _context.UserCarts
            .Where(c => c.UserId == request.UserId && !c.IsDeleted)
            .ToListAsync(cancellationToken);

        int mergedCount = 0;

        // ادغام آیتم‌های مهمان با سبد کاربر
        foreach (var guestItem in request.GuestCartItems)
        {
            // بررسی موجود بودن محصول
            var product = await _context.Products
                .FirstOrDefaultAsync(p => p.Id == guestItem.ProductId && !p.IsDeleted, cancellationToken);
            
            if (product == null)
                continue; // محصول پیدا نشد یا حذف شده

            // بررسی موجودی
            if (product.RemainingCount < guestItem.Count)
                continue; // موجودی کافی نیست

            // چک کردن آیا این محصول قبلاً در سبد کاربر هست
            var existingItem = existingCartItems.FirstOrDefault(c => c.ProductId == guestItem.ProductId);

            if (existingItem != null)
            {
                // آیتم موجود است → افزایش تعداد
                existingItem.Count += guestItem.Count;
                
                // محدود کردن به موجودی
                if (existingItem.Count > product.RemainingCount)
                    existingItem.Count = product.RemainingCount;
                
                _context.UserCarts.Update(existingItem);
            }
            else
            {
                // آیتم جدید → اضافه کردن به سبد
                var newCartItem = new UserCart
                {
                    UserId = request.UserId,
                    ProductId = guestItem.ProductId,
                    Count = Math.Min(guestItem.Count, product.RemainingCount)
                };
                
                await _context.UserCarts.AddAsync(newCartItem, cancellationToken);
            }

            mergedCount++;
        }

        await _context.SaveChangesAsync(cancellationToken);

        // محاسبه تعداد کل آیتم‌های سبد بعد از ادغام
        var totalItems = await _context.UserCarts
            .Where(c => c.UserId == request.UserId && !c.IsDeleted)
            .CountAsync(cancellationToken);

        return new MergeCartResponseDto
        {
            Success = true,
            Message = $"{mergedCount} محصول با موفقیت به سبد خرید اضافه شد",
            MergedItemsCount = mergedCount,
            TotalCartItems = totalItems
        };
    }
}
