using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.CommonData;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MECF.Framework.Common.RecipeCenter
{
    public class QdrRecipe : NotifiableItem
    {
        #region 内部变量
        private string _author;
        private string _description;
        private string _ppid;
        private RecipeType _recipeType = RecipeType.DEP;
        private DateTime _saveDate;
        private DateTime _createDate;
        private int _step1DwellTimeSeconds;
        private int _step1NumberOfRinse;
        private bool _step1N2BubbleOn;
        private int _step1NumberOfDumpToMetalDrain;
        public int _step2DwellTimeSeconds;
        private bool _step2N2BubbleOn;
        private int _step2NumberOfRinse;
        private bool _finalRinseDry;
        private int _finalRinsePulseClampTime;
        private int _finalRinseSlowDrainTime;
        private int _resistivityDurationSeconds;
        private int _resistivityStartTimeSeconds;
        private int _resistivityMegaOhms;
        private int _n2ChargeTimeSeconds=5;
        private int _dumpTimeSeconds=3;
        #endregion
        #region 属性
        [JsonProperty]
        public string Author { get { return _author; } set { _author = value; InvokePropertyChanged(nameof(Author)); } }
        [JsonProperty]
        public string Description { get { return _description; } set { _description = value; InvokePropertyChanged(nameof(Description)); } }
        [JsonProperty]
        public string Ppid { get { return _ppid; } set { _ppid = value; InvokePropertyChanged(nameof(Ppid)); } }
        [JsonProperty]
        public RecipeType RecipeType { get { return _recipeType; } set { _recipeType = value; InvokePropertyChanged(nameof(RecipeType)); } }
        [JsonProperty]
        public DateTime CreateDate { get { return _createDate; } set { _createDate = value; InvokePropertyChanged(nameof(CreateDate)); } }
        [JsonProperty]
        public DateTime SaveDate { get { return _saveDate; } set { _saveDate = value; InvokePropertyChanged(nameof(SaveDate)); } }
        [JsonProperty]
        public int Step1DwellTimeSeconds{ get { return _step1DwellTimeSeconds; } set { _step1DwellTimeSeconds = value; InvokePropertyChanged(nameof(Step1DwellTimeSeconds)); }}
        [JsonProperty]
        public int Step1NumberOfRinse { get { return _step1NumberOfRinse;} set { _step1NumberOfRinse = value;InvokePropertyChanged(nameof(Step1NumberOfRinse)); }}
        [JsonProperty]
        public bool Step1N2BubbleOn { get { return _step1N2BubbleOn; } set { _step1N2BubbleOn = value; InvokePropertyChanged(nameof(Step1N2BubbleOn)); }}
        [JsonProperty]
        public int Step1NumberOfDumpToMetalDrain { get { return _step1NumberOfDumpToMetalDrain; } set { _step1NumberOfDumpToMetalDrain = value;InvokePropertyChanged(nameof(Step1NumberOfDumpToMetalDrain)); } }
        [JsonProperty]
        public int Step2DwellTimeSeconds { get { return _step2DwellTimeSeconds; } set { _step2DwellTimeSeconds = value; InvokePropertyChanged(nameof(Step2DwellTimeSeconds)); } }
        [JsonProperty]
        public bool Step2N2BubbleOn { get { return _step2N2BubbleOn; } set { _step2N2BubbleOn = value;InvokePropertyChanged(nameof(Step2N2BubbleOn)); } }
        [JsonProperty]
        public int Step2NumberOfRinse { get { return _step2NumberOfRinse; } set { _step2NumberOfRinse = value;InvokePropertyChanged(nameof(Step2NumberOfRinse)); } }
        [JsonProperty]
        public bool FinalRinseDry { get { return _finalRinseDry; } set { _finalRinseDry = value;InvokePropertyChanged(nameof(FinalRinseDry)); } }
        [JsonProperty]
        public int FinalRinsePulseClampTime { get { return _finalRinsePulseClampTime; } set { _finalRinsePulseClampTime = value;InvokePropertyChanged(nameof(FinalRinsePulseClampTime)); } }
        [JsonProperty]
        public int FinalRinseSlowDrainTime { get { return _finalRinseSlowDrainTime; } set { _finalRinseSlowDrainTime = value;InvokePropertyChanged(nameof(FinalRinseSlowDrainTime)); } }
        [JsonProperty]
        public int ResistivityDurationSeconds { get { return _resistivityDurationSeconds; } set { _resistivityDurationSeconds = value; InvokePropertyChanged(nameof(ResistivityDurationSeconds)); }}
        [JsonProperty]
        public int ResistivityStartTimeSeconds { get { return _resistivityStartTimeSeconds; } set { _resistivityStartTimeSeconds = value; InvokePropertyChanged(nameof(ResistivityStartTimeSeconds)); } }
        [JsonProperty]
        public int ResistivityMegaOhms { get { return _resistivityMegaOhms; } set { _resistivityMegaOhms = value;InvokePropertyChanged(nameof(ResistivityMegaOhms)); } }
        [JsonProperty]
        public int N2ChargeTimeSeconds { get { return _n2ChargeTimeSeconds!=0?_n2ChargeTimeSeconds:5; } set { _n2ChargeTimeSeconds = value; InvokePropertyChanged(nameof(N2ChargeTimeSeconds)); } }
        [JsonProperty]
        public int DumpTimeSeconds { get { return _dumpTimeSeconds!=0?_dumpTimeSeconds:3; } set { _dumpTimeSeconds = value; InvokePropertyChanged(nameof(DumpTimeSeconds)); } }
        #endregion
        /// 
        /// 计算时间
        /// 
        /// 
        /// 
        /// 
        public int CalculateRunRecipeTime()
        {
            int concurrentFillTimeSeconds = SC.GetValue("QDR.ConcurrentFillTimeSeconds");
            int totaltime = 0;
            Dictionary processTimeDic = new Dictionary();
            processTimeDic.Add("RinseFirstStep.WaitDrianEmpty", DumpTimeSeconds);
            if (Step1N2BubbleOn)
            {
                processTimeDic.Add("RinseFirstStep.N2BubbleOnDelay", this.N2ChargeTimeSeconds);
            }
            processTimeDic.Add("RinseFirstStep.Recipe_FirstRinseCycleWaitEndFillTime", concurrentFillTimeSeconds * Step1NumberOfRinse);
            processTimeDic.Add("RinseFirstStep.Recipe_FirstRinseCycleWaitDwell", Step1DwellTimeSeconds * Step1NumberOfRinse);
            processTimeDic.Add("RinseFirstStep.Recipe_FirstRinseCycleWaitDrainExtraTime", DumpTimeSeconds * Step1NumberOfRinse);
            if (!FinalRinseDry) //没有第三步rinse
            {
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitEndFillTime", concurrentFillTimeSeconds * Step2NumberOfRinse);
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitDwell", Step2DwellTimeSeconds * (Step2NumberOfRinse - 1));
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitDrainExtraTime", DumpTimeSeconds * Step2NumberOfRinse);
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitResistivityStart", ResistivityStartTimeSeconds);
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleResistivityAveraging", ResistivityDurationSeconds);
            }
            else  //有第三步rinse
            {
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitEndFillTime", concurrentFillTimeSeconds * Step2NumberOfRinse);
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitDwell", Step2DwellTimeSeconds * Step2NumberOfRinse);
                processTimeDic.Add("RinseSecondStep.Recipe_SecondRinseCycleWaitDrainExtraTime", DumpTimeSeconds * Step2NumberOfRinse);
                processTimeDic.Add("RinseThirdStep.Recipe_ThirdRinseWaitEndFillTime", concurrentFillTimeSeconds);
                processTimeDic.Add("RinseThirdStep.Recipe_ThirdRinseCycleWaitSlowDrainTime", FinalRinseSlowDrainTime);
                processTimeDic.Add("RinseThirdStep.Recipe_ThirdRinseCycleWaitDrainExtraTime", DumpTimeSeconds);
            }
            totaltime = processTimeDic.Sum(x => x.Value);
            return totaltime;
        }
    }
}