// EN: Validator for PayOrderCommand with payment method-specific rules.
// VI: Validator cho PayOrderCommand với quy tắc theo phương thức thanh toán.

using FluentValidation;

namespace OrderService.API.Application.Validations;

/// <summary>
/// EN: Validator for PayOrderCommand — validates payment method and conditional fields.
/// VI: Validator cho PayOrderCommand — validate phương thức thanh toán và các trường điều kiện.
/// </summary>
public class PayOrderCommandValidator : AbstractValidator<Commands.PayOrderCommand>
{
    /// <summary>
    /// EN: Supported payment methods.
    /// VI: Các phương thức thanh toán được hỗ trợ.
    /// </summary>
    private static readonly string[] SupportedMethods = { "cash", "card", "vnpay", "momo", "qr", "transfer" };

    public PayOrderCommandValidator()
    {
        RuleFor(x => x.OrderId)
            .NotEmpty()
            .WithMessage("EN: Order ID is required / VI: Order ID là bắt buộc");

        RuleFor(x => x.ShopId)
            .NotEmpty()
            .WithMessage("EN: Shop ID is required / VI: Shop ID là bắt buộc");

        RuleFor(x => x.PaymentMethod)
            .NotEmpty()
            .WithMessage("EN: Payment method is required / VI: Phương thức thanh toán là bắt buộc")
            .Must(m => SupportedMethods.Contains(m?.ToLowerInvariant()))
            .WithMessage("EN: Payment method must be one of: cash, card, vnpay, momo, qr, transfer / VI: Phương thức thanh toán phải là: cash, card, vnpay, momo, qr, transfer");

        // EN: AmountTendered required for cash payments
        // VI: Số tiền khách đưa bắt buộc cho thanh toán tiền mặt
        RuleFor(x => x.AmountTendered)
            .NotNull()
            .When(x => x.PaymentMethod?.ToLowerInvariant() == "cash")
            .WithMessage("EN: Amount tendered is required for cash payments / VI: Số tiền khách đưa là bắt buộc cho thanh toán tiền mặt");

        RuleFor(x => x.AmountTendered)
            .GreaterThan(0)
            .When(x => x.AmountTendered.HasValue)
            .WithMessage("EN: Amount tendered must be greater than 0 / VI: Số tiền khách đưa phải lớn hơn 0");

        // EN: ReturnUrl required for online payment gateways
        // VI: ReturnUrl bắt buộc cho cổng thanh toán trực tuyến
        RuleFor(x => x.ReturnUrl)
            .NotEmpty()
            .When(x => x.PaymentMethod?.ToLowerInvariant() is "vnpay" or "momo")
            .WithMessage("EN: Return URL is required for online payments / VI: URL trả về là bắt buộc cho thanh toán trực tuyến");
    }
}
