using FluentValidation;
using MiningService.API.Application.Commands;

namespace MiningService.API.Application.Validations;

/// <summary>
/// EN: Validator for UpdateSystemConfigCommand.
/// VI: Validator cho UpdateSystemConfigCommand.
/// </summary>
public class UpdateSystemConfigCommandValidator : AbstractValidator<UpdateSystemConfigCommand>
{
    public UpdateSystemConfigCommandValidator()
    {
        RuleFor(x => x)
            .Must(x => x.Mining != null || x.Streak != null || x.Referral != null)
            .WithMessage("At least one config section must be provided / Phải cung cấp ít nhất một mục cấu hình");

        When(x => x.Mining != null, () =>
        {
            RuleFor(x => x.Mining!.BaseRate)
                .GreaterThan(0).WithMessage("Base rate must be positive / Tỷ lệ cơ bản phải dương")
                .When(x => x.Mining!.BaseRate.HasValue);

            RuleFor(x => x.Mining!.SessionDurationHours)
                .InclusiveBetween(1, 24).WithMessage("Session duration must be 1-24 hours / Thời lượng phiên phải từ 1-24 giờ")
                .When(x => x.Mining!.SessionDurationHours.HasValue);
        });

        When(x => x.Referral != null, () =>
        {
            RuleFor(x => x.Referral!.BonusPerReferral)
                .GreaterThan(0).WithMessage("Bonus per referral must be positive / Thưởng mỗi giới thiệu phải dương")
                .When(x => x.Referral!.BonusPerReferral.HasValue);

            RuleFor(x => x.Referral!.MaxBonusCap)
                .GreaterThan(0).WithMessage("Max bonus cap must be positive / Giới hạn thưởng tối đa phải dương")
                .When(x => x.Referral!.MaxBonusCap.HasValue);
        });
    }
}
