using FluentValidation;
using AdsManagerService.API.Application.Commands;

namespace AdsManagerService.API.Application.Validations;

/// <summary>
/// EN: Validator for CreateAdSetCommand.
/// VI: Validator cho CreateAdSetCommand.
/// </summary>
public class CreateAdSetCommandValidator : AbstractValidator<CreateAdSetCommand>
{
    private static readonly string[] ValidBidTypes = ["cpc", "cpm", "ocpm", "automatic"];

    public CreateAdSetCommandValidator()
    {
        RuleFor(x => x.CampaignId)
            .NotEmpty()
            .WithMessage("Campaign ID is required / Campaign ID là bắt buộc");

        RuleFor(x => x.Name)
            .NotEmpty()
            .WithMessage("Ad set name is required / Tên ad set là bắt buộc")
            .MaximumLength(200)
            .WithMessage("Ad set name max 200 characters / Tên ad set tối đa 200 ký tự");

        RuleFor(x => x.DailyBudget)
            .GreaterThan(0)
            .WithMessage("Daily budget must be greater than 0 / Ngân sách hàng ngày phải lớn hơn 0");

        RuleFor(x => x.BidType)
            .NotEmpty()
            .WithMessage("Bid type is required / Loại bid là bắt buộc")
            .Must(bt => ValidBidTypes.Contains(bt))
            .WithMessage("Bid type must be one of: cpc, cpm, ocpm, automatic / Loại bid phải là cpc, cpm, ocpm hoặc automatic");

        RuleFor(x => x.BidAmount)
            .GreaterThan(0)
            .When(x => x.BidAmount.HasValue)
            .WithMessage("Bid amount must be greater than 0 / Giá bid phải lớn hơn 0");

        RuleFor(x => x.MinAge)
            .InclusiveBetween(13, 65)
            .When(x => x.MinAge.HasValue)
            .WithMessage("Min age must be between 13 and 65 / Tuổi tối thiểu phải từ 13 đến 65");

        RuleFor(x => x.MaxAge)
            .InclusiveBetween(13, 65)
            .When(x => x.MaxAge.HasValue)
            .WithMessage("Max age must be between 13 and 65 / Tuổi tối đa phải từ 13 đến 65");

        RuleFor(x => x.MaxAge)
            .GreaterThanOrEqualTo(x => x.MinAge)
            .When(x => x.MinAge.HasValue && x.MaxAge.HasValue)
            .WithMessage("Max age must be greater than or equal to min age / Tuổi tối đa phải lớn hơn hoặc bằng tuổi tối thiểu");

        RuleFor(x => x.Locations)
            .MaximumLength(2000)
            .When(x => x.Locations != null)
            .WithMessage("Locations max 2000 characters / Vị trí tối đa 2000 ký tự");

        RuleFor(x => x.Interests)
            .MaximumLength(2000)
            .When(x => x.Interests != null)
            .WithMessage("Interests max 2000 characters / Sở thích tối đa 2000 ký tự");
    }
}
