using FluentValidation;
using TakeoutSaaS.Application.App.Billings.Commands;

namespace TakeoutSaaS.Application.App.Billings.Validators;

/// <summary>
/// 一键确认收款命令验证器。
/// </summary>
public sealed class ConfirmPaymentCommandValidator : AbstractValidator<ConfirmPaymentCommand>
{
    public ConfirmPaymentCommandValidator()
    {
        // 1. 账单 ID 必填
        RuleFor(x => x.BillingId)
            .GreaterThan(0)
            .WithMessage("账单 ID 必须大于 0");

        // 2. 支付金额必须大于 0
        RuleFor(x => x.Amount)
            .GreaterThan(0)
            .WithMessage("支付金额必须大于 0")
            .LessThanOrEqualTo(1_000_000_000)
            .WithMessage("支付金额不能超过 10 亿");

        // 3. 支付方式必填
        RuleFor(x => x.Method)
            .IsInEnum()
            .WithMessage("支付方式无效");

        // 4. 交易号必填
        RuleFor(x => x.TransactionNo)
            .NotEmpty()
            .WithMessage("交易号不能为空")
            .MaximumLength(64)
            .WithMessage("交易号不能超过 64 个字符");

        // 5. 支付凭证 URL（可选）
        RuleFor(x => x.ProofUrl)
            .MaximumLength(500)
            .WithMessage("支付凭证 URL 不能超过 500 个字符")
            .When(x => !string.IsNullOrWhiteSpace(x.ProofUrl));

        // 6. 备注（可选）
        RuleFor(x => x.Notes)
            .MaximumLength(500)
            .WithMessage("备注不能超过 500 个字符")
            .When(x => !string.IsNullOrWhiteSpace(x.Notes));
    }
}

