// EN: Validator for CreateReturnCommand.
// VI: Validator cho CreateReturnCommand.

using FluentValidation;
using OrderService.API.Application.Commands;
using OrderService.API.Application.DTOs;

namespace OrderService.API.Application.Validations;

/// <summary>
/// EN: Validator for CreateReturnCommand.
/// VI: Validator cho CreateReturnCommand.
/// </summary>
public class CreateReturnCommandValidator : AbstractValidator<CreateReturnCommand>
{
    public CreateReturnCommandValidator()
    {
        RuleFor(x => x.ShopId)
            .NotEmpty()
            .WithMessage("EN: Shop ID is required / VI: Shop ID là bắt buộc");

        RuleFor(x => x.OriginalOrderId)
            .NotEmpty()
            .WithMessage("EN: Original order ID is required / VI: ID đơn hàng gốc là bắt buộc");

        RuleFor(x => x.Reason)
            .NotEmpty()
            .WithMessage("EN: Return reason is required / VI: Lý do trả hàng là bắt buộc")
            .MaximumLength(1000)
            .WithMessage("EN: Return reason must not exceed 1000 characters / VI: Lý do trả hàng không được vượt quá 1000 ký tự");

        RuleFor(x => x.Items)
            .NotEmpty()
            .WithMessage("EN: At least one return item is required / VI: Cần ít nhất một item trả hàng")
            .Must(items => items != null && items.Count > 0)
            .WithMessage("EN: At least one return item is required / VI: Cần ít nhất một item trả hàng");

        RuleForEach(x => x.Items).SetValidator(new ReturnItemValidator());
    }
}

/// <summary>
/// EN: Validator for ReturnItemDto.
/// VI: Validator cho ReturnItemDto.
/// </summary>
public class ReturnItemValidator : AbstractValidator<ReturnItemDto>
{
    public ReturnItemValidator()
    {
        RuleFor(x => x.OrderItemId)
            .NotEmpty()
            .WithMessage("EN: Order item ID is required / VI: ID item đơn hàng là bắt buộc");

        RuleFor(x => x.Quantity)
            .GreaterThan(0)
            .WithMessage("EN: Return quantity must be greater than 0 / VI: Số lượng trả phải lớn hơn 0");

        RuleFor(x => x.Reason)
            .MaximumLength(500)
            .WithMessage("EN: Item reason must not exceed 500 characters / VI: Lý do item không được vượt quá 500 ký tự")
            .When(x => x.Reason != null);
    }
}
