using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Runtime.Serialization;
using AMESCoreStudio.WebApi.Models.BAS;

namespace AMESCoreStudio.WebApi.Models.AMES
{
    /// <summary>
    /// 工單基本資料文件
    /// </summary>
    [Table("WIP_INFO", Schema = "JHAMES")]
    [DataContract]
    public class WipInfo
    {
        /// <summary>
        /// 工單ID
        /// </summary>
        [Key]
        [Column("WIP_ID")]
        [Required(ErrorMessage = "{0},不能空白")]
        [DataMember]
        public int WipID { get; set; }

        /// <summary>
        /// 工單號碼
        /// </summary>
        [Column("WIP_NO")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "工單號碼")]
        public string WipNO { get; set; }

        /// <summary>
        /// 計劃數量
        /// </summary>
        [Column("PLAN_QTY")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "計劃數量")]
        public int PlanQTY { get; set; } = 0;

        /// <summary>
        /// 第一站完成數量
        /// </summary>
        [Column("COMPLETE_QTY")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "第一站完成數量")]
        public int CompleteQTY { get; set; } = 0;

        /// <summary>
        /// 線別ID
        /// </summary>
        [Column("LINE_ID")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Range(1, int.MaxValue)]
        [Display(Name = "線別ID")]
        public int? LineID { get; set; }

        /// <summary>
        /// 生產單位
        /// </summary>
        [Column("UNIT_NO")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "生產單位")]
        public string UnitNO { get; set; } = "1";

        /// <summary>
        /// 產品別
        /// </summary>
        [Column("PRODUCT_TYPE_ID")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "產品別")]
        public int ProductTypeID { get; set; } = 1;

        /// <summary>
        /// 業務
        /// </summary>
        [Column("SALES")]
        [DataMember]
        [Display(Name = "業務")]
        public string Sales { get; set; }

        /// <summary>
        /// 訂單號碼 or 客戶訂單
        /// </summary>
        [Column("ORDER_NO")]
        [DataMember]
        [Display(Name = "客戶訂單")]
        public string OrderNO { get; set; }

        /// <summary>
        /// 流程ID
        /// </summary>
        [Column("FLOW_RULE_ID")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "流程ID")]
        public int FlowRuleID { get; set; } = 0;

        /// <summary>
        /// 工單狀態
        /// </summary>
        [Column("STATUS_NO")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "工單狀態")]
        public string StatusNO { get; set; } = "N";

        /// <summary>
        /// 工單開工次數
        /// </summary>
        [Column("WIP_TIMES")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "工單開工次數")]
        public int WipTimes { get; set; } = 0;

        /// <summary>
        /// 包裝起始箱號
        /// </summary>
        [Column("CNO")]
        [DataMember]
        [Display(Name = "包裝起始箱號")]
        public string CNO { get; set; }

        /// <summary>
        /// 單箱數量
        /// </summary>
        [Column("BOX_CNT")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "單箱數量")]
        public int BoxCNT { get; set; } = 0;

        /// <summary>
        /// SFIS流程確認(Y/N)
        /// </summary>
        [Column("SFIS_FLOW_CK")]
        [DataMember]
        public string SFISFlowCk { get; set; } = "N";

        /// <summary>
        /// 判斷前製程是否已經投入 (Y-判斷;N-不判斷)
        /// </summary>
        [Column("INPUT_FLAG")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "判斷前製程")]
        public string InputFlag { get; set; } = "N";

        /// <summary>
        /// 混線投入機種檢查(Y-檢查;N-不檢查)
        /// </summary>
        [Column("MODEL_CHECK")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "混線投入機")]
        public string ModelCheck { get; set; } = "Y";

        /// <summary>
        /// 制令序號
        /// </summary>
        [Column("WIP_SEQ")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "制令序號")]
        public int WipSEQ { get; set; } = 1;

        /// <summary>
        /// 混線投入ECN相同檢查(Y-檢查;N-不檢查)
        /// </summary>
        [Column("ECN_CHECK")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "混線投入ECN相同檢查")]
        public string ECNCheck { get; set; } = "N";

        /// <summary>
        /// 建立者
        /// </summary>
        [Column("CREATE_USERID")]
        [DataMember]
        [Display(Name = "建立者")]
        public int CreateUserID { get; set; } = 0;

        /// <summary>
        /// 建立日期
        /// </summary>
        [Column("CREATE_DATE")]
        [DataMember]
        [Display(Name = "建立日期")]
        public DateTime CreateDate { get; set; } = DateTime.Now;

        /// <summary>
        /// 修改日期
        /// </summary>
        [Column("UPDATE_DATE")]
        [DataMember]
        [Display(Name = "修改日期")]
        public DateTime UpdateDate { get; set; } = DateTime.Now;

        /// <summary>
        /// 打印狀態
        /// </summary>
        [Column("PRINT_FLAG")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "打印狀態")]
        public int PrintFlag { get; set; } = 0;

        /// <summary>
        /// 工單備註
        /// </summary>
        [Column("REMARKS")]
        [DataMember]
        [Display(Name = "工單備註")]
        public string Remarks { get; set; }

        /// <summary>
        /// 工單描述 or 機種描述
        /// </summary>
        [Column("DESCRIPTION")]
        [DataMember]
        [Display(Name = "機種描述")]
        public string Description { get; set; }

        /// <summary>
        /// 線上強制工單(Y-是;N-否)
        /// </summary>
        [Column("PRIORITY")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "線上強制工單")]
        public string Priority { get; set; } = "N";

        /// <summary>
        /// 預計開工日期
        /// </summary>
        [Column("WIP_SCHEDULE_DATE")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [DataType(DataType.Text), DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "預計開工日期")]
        public DateTime WipScheduleDate { get; set; }

        /// <summary>
        /// 預計完工日期
        /// </summary>
        [Column("WIP_DUE_DATE")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [DataType(DataType.Text), DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "預計完工日期")]
        public DateTime WipDueDate { get; set; }

        /// <summary>
        /// 廠別/委外廠
        /// </summary>
        [Column("WERKS")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "廠別/委外廠")]
        public string Werks { get; set; }

        /// <summary>
        /// 工單類型(S-標準工單;R-重工工單;N-無序號工單)
        /// </summary>
        [Column("WIP_TYPE")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "工單類型")]
        public string WipType { get; set; }

        /// <summary>
        /// 客戶類別
        /// </summary>
        [Column("CUSTOMER_TYPE")]
        [DataMember]
        [Required(ErrorMessage = "{0},不能空白")]
        [Display(Name = "客戶類別")]
        public int CustomerType { get; set; }

        /// <summary>
        /// 客戶類別醫療(Y-是;N-否)
        /// </summary>
        [Column("CUSTOMER_MEDICAL")]
        [DataMember]
        public string CustomerMedical { get; set; } = "N";

        /// <summary>
        /// 客戶類別VIP(Y-是;N-否)
        /// </summary>
        [Column("CUSTOMER_VIP")]
        [DataMember]
        public string CustomerVIP { get; set; } = "N";

        /// <summary>
        /// 關聯工單
        /// </summary>
        [Column("RELATED_WO_NO")]
        [DataMember]
        [Display(Name = "關聯工單")]
        public string RelatedWONO { get; set; }

        /// <summary>
        /// 委外廠編號
        /// </summary>
        [Column("WERKS_NO")]
        [DataMember]
        [Display(Name = "委外廠編號")]
        public string WerksNO { get; set; }

        /// <summary>
        /// 客戶名稱
        /// </summary>
        [Column("CUSTOMER_NO")]
        [DataMember]
        [Display(Name = "客戶名稱")]
        public string CustomerNO { get; set; }

        /// <summary>
        /// 客戶料號 or 成品料號
        /// </summary>
        [Column("CUSTOMER_ITEM_NO")]
        [DataMember]
        [Display(Name = "成品料號")]
        public string CustomerItemNO { get; set; }

        /// <summary>
        /// 作業流程備註
        /// </summary>
        [Column("FLOW_REMARK")]
        [DataMember]
        [Display(Name = "作業流程備註")]
        public string FlowRemark { get; set; }

        /// <summary>
        /// 客戶工單
        /// </summary>
        [Column("CUSTOMER_WIPNO")]
        [DataMember]
        [Display(Name = "客戶工單")]
        public string CustomerWipNo { get; set; }

        /// <summary>
        /// 生產單位
        /// </summary>
        [ForeignKey("UnitNO")]
        [DataMember]
        public virtual FactoryUnit GetFactoryUnit { get; set; }

        /// <summary>
        /// 線別
        /// </summary>
        [ForeignKey("LineID")]
        [DataMember]
        public virtual LineInfo GetLineInfo { get; set; }

        /// <summary>
        /// 工單-基本資料
        /// </summary>
        [ForeignKey("WipNO")]
        [DataMember]
        public virtual WipAtt GetWipAtt { get; set; }

        ///// <summary>
        ///// 流程站別
        ///// </summary>
        //[ForeignKey("FlowRuleID")]
        //[DataMember]
        //public virtual AMESCoreStudio.WebApi.Models.BAS.RuleStation GetRuleStation { get; set; }
    }
}