using DataAnnotationsExtensions;
using Lada.Framework.DTO.Enums;
using System.ComponentModel.DataAnnotations;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Orders
{
    /// <summary>
    /// Model hàng hóa trong đơn hàng
    /// </summary>
    public class OrderPackageModel : IValidatableObject
    {
        /// <summary>
        /// ID của kiện hàng
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Ảnh kiện hàng
        /// </summary>
        public string Picture { get; set; } = "";


        /// <summary>
        /// Mã kiện hàng
        /// </summary>
        public string Code { get; set; } = "";


        /// <summary>
        /// Tên hàng hóa
        /// </summary>
        [Required(ErrorMessage = "Tên hàng hóa không để trống")]
        public string Name { get; set; } = "";

        /// <summary>
        /// Trọng lượng cân nặng của 1 kiện hàng
        /// </summary>
        [Required(ErrorMessage = "Trọng lượng không để trống")]
        public decimal Weight { get; set; }

        /// <summary>
        /// Chiều dài 1 kiện hàng
        /// </summary>
        public int Length { get; set; }

        /// <summary>
        /// Chiều rộng 1 kiện hàng
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// Chiều cao 1 kiện hàng
        /// </summary>
        public int Height { get; set; }


        /// <summary>
        /// Số lượng kiện
        /// </summary>
        [Min(1, ErrorMessage = "Số lượng kiện phải lớn hơn 0")]
        public int Quantity { get; set; }

        /// <summary>
        /// Tổng trọng lượng của kiện hàng
        /// </summary>
        public decimal SubTotalWeight { get; set; }

        /// <summary>
        /// Ghi chú của kiện hàng
        /// </summary>
        public string Note { get; set; } = "";

        /// <summary>
        /// Đơn vị trọng lượng (hiển thị cho client)
        /// </summary>
        public UnitOfWeight WeightUnit { get; set; } = UnitOfWeight.Kilogram;

        /// <summary>
        /// Đơn vị kích thước (hiển thị cho client)
        /// </summary>
        public UnitOfDistance DimensionUnit { get; set; } = UnitOfDistance.Centimet;

        /// <summary>
        /// Xác thực kiện hàng, hàng phải có trọng lượng cân nặng hoặc trọng lượng kích thước
        /// </summary>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (Weight == 0)
            {
                if (Length == 0)
                {
                    yield return new ValidationResult("Vui lòng nhập trọng lượng", new[] { nameof(Length) });
                }
                if (Width == 0)
                {
                    yield return new ValidationResult("Vui lòng nhập trọng lượng", new[] { nameof(Width) });
                }
                if (Height == 0)
                {
                    yield return new ValidationResult("Vui lòng nhập trọng lượng", new[] { nameof(Height) });
                }

            }
        }
    }
}
