using System.ComponentModel.DataAnnotations;

namespace WebClientTpos.Shared.DTOs;

/// <summary>
/// EN: Product data transfer object with validation.
/// VI: DTO sản phẩm với validation.
/// </summary>
/// <remarks>
/// EN: This DTO is shared between Client and Server for consistent validation.
/// VI: DTO này được chia sẻ giữa Client và Server để validation nhất quán.
/// </remarks>
public class ProductDto
{
    /// <summary>
    /// EN: Product name, required with length constraints.
    /// VI: Tên sản phẩm, bắt buộc với ràng buộc độ dài.
    /// </summary>
    [Required(ErrorMessage = "Tên sản phẩm là bắt buộc / Name is required")]
    [StringLength(100, MinimumLength = 3, ErrorMessage = "Tên phải từ 3-100 ký tự / Name must be 3-100 chars")]
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// EN: Product description.
    /// VI: Mô tả sản phẩm.
    /// </summary>
    [StringLength(500, ErrorMessage = "Mô tả tối đa 500 ký tự / Max 500 characters")]
    public string? Description { get; set; }

    /// <summary>
    /// EN: Product price, must be positive.
    /// VI: Giá sản phẩm, phải dương.
    /// </summary>
    [Required(ErrorMessage = "Giá là bắt buộc / Price is required")]
    [Range(0.01, 1_000_000_000, ErrorMessage = "Giá phải từ 0.01 đến 1 tỷ / Price must be 0.01 to 1B")]
    public decimal Price { get; set; }

    /// <summary>
    /// EN: Stock quantity.
    /// VI: Số lượng tồn kho.
    /// </summary>
    [Range(0, int.MaxValue, ErrorMessage = "Số lượng không âm / Quantity must be non-negative")]
    public int Quantity { get; set; }
}

/// <summary>
/// EN: Create product request DTO.
/// VI: DTO request tạo sản phẩm.
/// </summary>
public class CreateProductDto : ProductDto
{
    /// <summary>
    /// EN: Product category ID.
    /// VI: ID danh mục sản phẩm.
    /// </summary>
    [Required(ErrorMessage = "Danh mục là bắt buộc / Category is required")]
    public Guid CategoryId { get; set; }
}

/// <summary>
/// EN: Update product request DTO.
/// VI: DTO request cập nhật sản phẩm.
/// </summary>
public class UpdateProductDto : ProductDto
{
    /// <summary>
    /// EN: Product ID.
    /// VI: ID sản phẩm.
    /// </summary>
    [Required]
    public Guid Id { get; set; }
}
