using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Domain.Enums;
using MediatR;

namespace CMSMicroservice.Application.PackageCQ.Queries.GetUserPackageStatus;

public class GetUserPackageStatusQueryHandler : IRequestHandler<GetUserPackageStatusQuery, UserPackageStatusDto>
{
    private readonly IApplicationDbContext _context;

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

    public async Task<UserPackageStatusDto> Handle(GetUserPackageStatusQuery request, CancellationToken cancellationToken)
    {
        // TODO: پیاده‌سازی دریافت وضعیت پکیج کاربر
        //
        // 1. دریافت اطلاعات کاربر:
        //    - var user = await _context.Users
        //        .Include(u => u.UserWallet)
        //        .FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken)
        //    - if (user == null) throw new NotFoundException("کاربر یافت نشد")
        //
        // 2. دریافت عضویت باشگاه:
        //    - var clubMembership = await _context.ClubMemberships
        //        .FirstOrDefaultAsync(c => c.UserId == user.Id && c.IsActive, cancellationToken)
        //
        // 3. دریافت آخرین سفارش پکیج:
        //    - var lastPackageOrder = await _context.UserOrders
        //        .Where(o => o.UserId == user.Id && o.PackageId != null)
        //        .OrderByDescending(o => o.Created)
        //        .FirstOrDefaultAsync(cancellationToken)
        //
        // 4. بررسی شرایط فعالسازی باشگاه:
        //    - var wallet = user.UserWallet
        //    - bool canActivate = 
        //        user.PackagePurchaseMethod != PackagePurchaseMethod.None &&
        //        clubMembership == null &&
        //        wallet != null &&
        //        wallet.Balance >= 56_000_000
        //
        // 5. برگشت DTO:
        //    - return new UserPackageStatusDto {
        //        UserId = user.Id,
        //        PackagePurchaseMethod = user.PackagePurchaseMethod.ToString(),
        //        HasPurchasedPackage = user.PackagePurchaseMethod != PackagePurchaseMethod.None,
        //        IsClubMemberActive = clubMembership != null,
        //        WalletBalance = wallet?.Balance ?? 0,
        //        DiscountBalance = wallet?.DiscountBalance ?? 0,
        //        CanActivateClubMembership = canActivate,
        //        LastOrderNumber = lastPackageOrder?.OrderNumber,
        //        LastPurchaseDate = lastPackageOrder?.Created
        //      }
        //
        // نکته: این query برای UI مفید است تا وضعیت کاربر را نمایش دهد

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