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

namespace CMSMicroservice.Application.ClubFeatureCQ.Commands.ToggleUserClubFeature;

/// <summary>
/// هندلر برای فعال/غیرفعال کردن ویژگی باشگاه کاربر
/// </summary>
public class ToggleUserClubFeatureCommandHandler : IRequestHandler<ToggleUserClubFeatureCommand, ToggleUserClubFeatureResponse>
{
    private readonly IApplicationDbContext _context;

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

    public async Task<ToggleUserClubFeatureResponse> Handle(ToggleUserClubFeatureCommand request, CancellationToken cancellationToken)
    {
        // بررسی وجود کاربر
        var userExists = await _context.Users
            .AnyAsync(u => u.Id == request.UserId && !u.IsDeleted, cancellationToken);

        if (!userExists)
        {
            return new ToggleUserClubFeatureResponse
            {
                Success = false,
                Message = "کاربر یافت نشد"
            };
        }

        // بررسی وجود ویژگی
        var featureExists = await _context.ClubFeatures
            .AnyAsync(cf => cf.Id == request.ClubFeatureId && !cf.IsDeleted, cancellationToken);

        if (!featureExists)
        {
            return new ToggleUserClubFeatureResponse
            {
                Success = false,
                Message = "ویژگی باشگاه یافت نشد"
            };
        }

        // یافتن رکورد UserClubFeature
        var userClubFeature = await _context.UserClubFeatures
            .FirstOrDefaultAsync(
                ucf => ucf.UserId == request.UserId 
                    && ucf.ClubFeatureId == request.ClubFeatureId 
                    && !ucf.IsDeleted,
                cancellationToken);

        if (userClubFeature == null)
        {
            return new ToggleUserClubFeatureResponse
            {
                Success = false,
                Message = "این ویژگی برای کاربر یافت نشد"
            };
        }

        // به‌روزرسانی وضعیت
        userClubFeature.IsActive = request.IsActive;
        userClubFeature.LastModified = DateTime.UtcNow;

        await _context.SaveChangesAsync(cancellationToken);

        return new ToggleUserClubFeatureResponse
        {
            Success = true,
            Message = request.IsActive ? "ویژگی با موفقیت فعال شد" : "ویژگی با موفقیت غیرفعال شد",
            UserClubFeatureId = userClubFeature.Id,
            IsActive = userClubFeature.IsActive
        };
    }
}
