using Bp.Sync.Domain.Entities.BaseEntities;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;

namespace Bp.Sync.Domain.Entities.Inventories.Products
{
    public class Product : BaseEntityWithKey<long>
    {
        /// <summary>
        /// Tên sản phẩm
        /// </summary>
        [Column(TypeName = "nvarchar(512)")]
        public string Name { get; set; }

        /// <summary>
        /// Mã sản phẩm
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string Code { get; set; }

        /// <summary>
        /// Mã đối tác
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string PartnerCode { get; set; }

        /// <summary>
        /// Thành phần hoạt chất thuốc
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string ActiveIngredient { get; set; }

        /// <summary>
        /// Hàm lượng thuốc
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string Content { get; set; }

        /// <summary>
        /// Mã nhóm thuốc
        /// </summary>
        public int ProductGroupId { get; set; }

        /// <summary>
        /// Mã loại thuốc
        /// </summary>
        public int ProductTypeId { get; set; }

        /// <summary>
        /// Ghi chú sử dụng
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string Note { get; set; }

        /// <summary>
        /// Quy cách đóng gói
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string PackingSize { get; set; }

        /// <summary>
        /// Mã SKU
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string Sku { get; set; }

        /// <summary>
        /// Trạng thái sản phẩm
        /// </summary>
        public ProductStatus Status { get; set; }

        /// <summary>
        /// Số lượng cảnh báo hết hàng
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal QuantityWarning { get; set; }

        /// <summary>
        /// Số lượng dự trù
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal QuantityPlanning { get; set; }

        /// <summary>
        /// Cập nhật lại giá trị quy đổi trong ProductUnit
        /// </summary>
        public bool IsUpateExchange { get; set; }

        /// <summary>
        /// Cập nhật lại giá trong ProductUnit
        /// </summary>
        public bool IsUpatePrice { get; set; }

        /// <summary>
        /// Cập nhật xuất-nhập-tồn
        /// </summary>
        public bool IsUpateProductBill { get; set; } = true;

        /// <summary>
        /// Là sản phẩm độc quyền?
        /// </summary>
        public bool IsExclusiveProduct { get; set; }

        /// <summary>
        /// Dạng bào chế
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string DosageForm { get; set; }

        /// <summary>
        /// Nhà sản xuất
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string Manufacturer { get; set; }

        /// <summary>
        /// Nước sản xuất
        /// </summary>
        [Column(TypeName = "nvarchar(512)")]
        public string CountryMade { get; set; }

        /// <summary>
        /// Nhà nhập khẩu
        /// </summary>
        [Column(TypeName = "nvarchar(512)")]
        public string Importer { get; set; }

        /// <summary>
        /// Số đăng ký thuốc
        /// </summary>
        [Column(TypeName = "nvarchar(512)")]
        public string ProductRegister { get; set; }

        /// <summary>
        /// Ghi chú của IT
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string TechNote { get; set; }

        /// <summary>
        /// Là sản phẩm quảng cáo?
        /// </summary>
        public bool IsAdvertisingProduct { get; set; }

        /// <summary>
        /// ID của nhà cung cấp
        /// </summary>
        public int SupplierId { get; set; }
    }

    public enum ProductStatus
    {
        [Description("Đang kinh doanh")]
        AllowsBusiness = 1,

        [Description("Ngừng kinh doanh")]
        StopBusiness = 2
    }

    public enum PhysicalStatus
    {
        [Description("Tạo mới")]
        New = 1,

        [Description("Tồn kho")]
        Inventory = 2,

        [Description("Xuất kho")]
        Exported = 3
    }
}