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

namespace AdsManagerService.API.Application.Validations;

/// <summary>
/// EN: Validator for CreateCampaignCommand.
/// VI: Validator cho CreateCampaignCommand.
/// </summary>
public class CreateCampaignCommandValidator : AbstractValidator<CreateCampaignCommand>
{
    private static readonly string[] ValidObjectives = ["awareness", "traffic", "conversion", "engagement", "app_install", "lead_generation"];
    private static readonly string[] ValidBudgetTypes = ["daily", "lifetime"];

    public CreateCampaignCommandValidator()
    {
        RuleFor(x => x.AdvertiserId)
            .NotEmpty()
            .WithMessage("Advertiser ID is required / Advertiser ID 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 characters / Tên chiến dịch tối đa 200 ký tự");

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

        RuleFor(x => x.Objective)
            .NotEmpty()
            .WithMessage("Objective is required / Mục tiêu là bắt buộc")
            .Must(o => ValidObjectives.Contains(o))
            .WithMessage("Invalid objective. Must be one of: awareness, traffic, conversion, engagement, app_install, lead_generation / Mục tiêu không hợp lệ");

        RuleFor(x => x.BudgetType)
            .NotEmpty()
            .WithMessage("Budget type is required / Loại ngân sách là bắt buộc")
            .Must(bt => ValidBudgetTypes.Contains(bt))
            .WithMessage("Budget type must be 'daily' or 'lifetime' / Loại ngân sách phải là 'daily' hoặc 'lifetime'");

        RuleFor(x => x.BudgetAmount)
            .GreaterThan(0)
            .WithMessage("Budget amount must be greater than 0 / Ngân sách phải lớn hơn 0");

        RuleFor(x => x.Currency)
            .NotEmpty()
            .WithMessage("Currency is required / Đơn vị tiền tệ là bắt buộc")
            .MaximumLength(3)
            .WithMessage("Currency code max 3 characters / Mã tiền tệ tối đa 3 ký tự");

        RuleFor(x => x.EndDate)
            .GreaterThan(x => x.StartDate)
            .When(x => x.StartDate.HasValue && x.EndDate.HasValue)
            .WithMessage("End date must be after start date / Ngày kết thúc phải sau ngày bắt đầu");
    }
}
