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

namespace Bp.Sync.Domain.Entities.Inventories.Products
{
    /// <summary>
    /// Bảng chi tiết sản phẩm và mã phiếu sử dụng để tổng hợp nhập - xuất - tồn
    /// </summary>
    public class ProductBill : BaseEntityWithKey<long>
    {
        /// <summary>
        /// Mã phiếu
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string BillCode { get; set; }
        /// <summary>
        /// ID của sản phẩm
        /// </summary>
        public long ProductId { get; set; }
        /// <summary>
        /// Ngày hạch toán
        /// </summary>
        public DateTimeOffset? AccountingDate { get; set; }
        /// <summary>
        /// Ngày chứng từ
        /// </summary>
        public DateTimeOffset? VocherDate { get; set; }
        /// <summary>
        /// Id đơn vị tính
        /// </summary>
        public int UnitId { get; set; }
        /// <summary>
        /// Giá bán lẻ
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal Price { get; set; }
        /// <summary>
        /// Số lượng nhập
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal InputQuantity { get; set; }
        /// <summary>
        /// Giá trị nhập
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal InputPrice { get; set; }
        /// <summary>
        /// Số lượng xuất
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal OutputQuantity { get; set; }
        /// <summary>
        /// Giá trị xuất
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal OutputPrice { get; set; }
        /// <summary>
        /// Số lượng tồn
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal InventoryQuantity { get; set; }
        /// <summary>
        /// Giá trị tồn
        /// </summary>
        [Column(TypeName = "decimal(18, 8)")]
        public decimal InventoryPrice { get; set; }
        /// <summary>
        /// Diễn giải
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string Description { get; set; }
        /// <summary>
        /// Loại nhập/xuất
        /// </summary>
        public ProductBillType ProductBillType { get; set; }
        /// <summary>
        /// Mã lưu kho
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string InventoryCode { get; set; }
        /// <summary>
        /// Mã chi nhánh xuất hàng đến
        /// </summary>
        public int DestBranchId { get; set; }
        /// <summary>
        /// ID của bản ghi trong chi tiết phiếu
        /// </summary>
        public long RelatedId { get; set; }
        /// <summary>
        /// Xác định duy nhất
        /// </summary>
        [Column(TypeName = "nvarchar(128)")]
        public string UniqueKey { get; set; }
        /// <summary>
        /// Loại sổ
        /// </summary>
        public BookType BookType { get; set; }
        /// <summary>
        /// ID của chi nhánh
        /// </summary>
        public int BranchId { get; set; }
    }

    public enum ProductBillType
    {
        [Description("Nhập kho")]
        Inbound = 1,
        [Description("Xuất kho")]
        Outbound = 2,
    }
}
