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

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

namespace OrderService.API.Application.Validations;

/// <summary>
/// EN: Validator for CreateExchangeCommand.
/// VI: Validator cho CreateExchangeCommand.
/// </summary>
public class CreateExchangeCommandValidator : AbstractValidator<CreateExchangeCommand>
{
    public CreateExchangeCommandValidator()
    {
        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: Exchange reason is required / VI: Lý do đổi hàng là bắt buộc")
            .MaximumLength(1000)
            .WithMessage("EN: Exchange reason must not exceed 1000 characters / VI: Lý do đổi hàng không được vượt quá 1000 ký tự");

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

        RuleForEach(x => x.ReturnItems).SetValidator(new ReturnItemValidator());

        RuleFor(x => x.NewItems)
            .NotEmpty()
            .WithMessage("EN: At least one exchange item is required / VI: Cần ít nhất một item đổi hàng");

        RuleForEach(x => x.NewItems).SetValidator(new ExchangeItemValidator());
    }
}

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

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

        RuleFor(x => x.UnitPrice)
            .GreaterThanOrEqualTo(0)
            .WithMessage("EN: Unit price must be greater than or equal to 0 / VI: Đơn giá phải lớn hơn hoặc bằng 0");
    }
}
