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

using FluentValidation;

namespace OrderService.API.Application.Validations;

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

        RuleFor(x => x.Items)
            .NotEmpty()
            .WithMessage("EN: Order must have at least one item / VI: Order phải có ít nhất một item")
            .Must(items => items != null && items.Count > 0)
            .WithMessage("EN: Order must have at least one item / VI: Order phải có ít nhất một item");

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

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

        RuleFor(x => x.ProductName)
            .NotEmpty()
            .WithMessage("EN: Product name is required / VI: Tên sản phẩm là bắt buộc")
            .MaximumLength(255)
            .WithMessage("EN: Product name must not exceed 255 characters / VI: Tên sản phẩm không được vượt quá 255 ký tự");

        RuleFor(x => x.ProductType)
            .NotEmpty()
            .WithMessage("EN: Product type is required / VI: Loại sản phẩm là bắt buộc")
            .Must(type => new[] { "Physical", "Service", "PreparedFood" }.Contains(type))
            .WithMessage("EN: Invalid product type / VI: Loại sản phẩm không hợp lệ");

        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");
    }
}
