using FluentValidation;
using PromotionService.API.Application.Commands;

namespace PromotionService.API.Application.Validations;

/// <summary>
/// EN: Validator for CreateCampaignCommand.
/// VI: Validator cho CreateCampaignCommand.
/// </summary>
public class CreateCampaignCommandValidator : AbstractValidator<CreateCampaignCommand>
{
    public CreateCampaignCommandValidator()
    {
        RuleFor(x => x.MerchantId)
            .NotEmpty().WithMessage("Merchant ID is required / ID merchant là bắt buộc");

        RuleFor(x => x.MerchantWalletId)
            .NotEmpty().WithMessage("Merchant wallet ID is required / ID ví merchant là bắt buộc");

        RuleFor(x => x.Name)
            .NotEmpty().WithMessage("Campaign name is required / Tên chiến dịch là bắt buộc")
            .MaximumLength(200).WithMessage("Campaign name max 200 chars / Tên chiến dịch tối đa 200 ký tự");

        RuleFor(x => x.Description)
            .MaximumLength(1000).WithMessage("Description max 1000 chars / Mô tả tối đa 1000 ký tự")
            .When(x => x.Description != null);

        RuleFor(x => x.BackingAssetType)
            .NotEmpty().WithMessage("Backing asset type is required / Loại tài sản đảm bảo là bắt buộc")
            .MaximumLength(50).WithMessage("Backing asset type max 50 chars / Loại tài sản đảm bảo tối đa 50 ký tự");

        RuleFor(x => x.BackingAssetCode)
            .NotEmpty().WithMessage("Backing asset code is required / Mã tài sản đảm bảo là bắt buộc")
            .MaximumLength(50).WithMessage("Backing asset code max 50 chars / Mã tài sản đảm bảo tối đa 50 ký tự");

        RuleFor(x => x.FaceValue)
            .GreaterThan(0).WithMessage("Face value must be positive / Mệnh giá phải dương");

        RuleFor(x => x.AcquisitionType)
            .NotEmpty().WithMessage("Acquisition type is required / Loại nhận là bắt buộc")
            .MaximumLength(50).WithMessage("Acquisition type max 50 chars / Loại nhận tối đa 50 ký tự");

        RuleFor(x => x.AcquisitionPrice)
            .GreaterThanOrEqualTo(0).WithMessage("Acquisition price must be non-negative / Giá nhận không được âm");

        RuleFor(x => x.TotalVouchers)
            .GreaterThan(0).WithMessage("Total vouchers must be positive / Tổng voucher phải dương")
            .LessThanOrEqualTo(1000000).WithMessage("Total vouchers max 1,000,000 / Tổng voucher tối đa 1.000.000");

        RuleFor(x => x.StartDate)
            .NotEmpty().WithMessage("Start date is required / Ngày bắt đầu là bắt buộc");

        RuleFor(x => x.EndDate)
            .NotEmpty().WithMessage("End date is required / Ngày kết thúc là bắt buộc")
            .GreaterThan(x => x.StartDate).WithMessage("End date must be after start date / Ngày kết thúc phải sau ngày bắt đầu");

        RuleFor(x => x.VoucherValidityDays)
            .InclusiveBetween(1, 365).WithMessage("Voucher validity must be 1-365 days / Hiệu lực voucher phải từ 1-365 ngày");

        RuleFor(x => x.MaxPerUser)
            .InclusiveBetween(1, 100).WithMessage("Max per user must be 1-100 / Tối đa mỗi người phải từ 1-100");
    }
}
