using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace MECF.Framework.Common.CommonData
{
    [DataContract]
    [Serializable]
    public class HistoryCarrierData
    {
        [DataMember]
        public string Guid { get; set; }
        [DataMember]
        public string Rfid { get; set; }
        [DataMember]
        public string Station { get; set; }
        [DataMember]
        public string LoadTime { get; set; }
        [DataMember]
        public string UnloadTime { get; set; }
        [DataMember]
        public string LotId { get; set; }
        [DataMember]
        public string ProductCategory { get; set; }
    }
    [DataContract]
    [Serializable]
    public class HistoryProcessData
    {
        [DataMember]
        public string Guid { get; set; }
        [DataMember]
        public string StartTime { get; set; }
        [DataMember]
        public string EndTime { get; set; }
        [DataMember]
        public string RecipeName { get; set; }
        [DataMember]
        public string Result { get; set; }
    }
 
    [DataContract]
    [Serializable]
    public class HistoryWaferData
    {
        [DataMember]
        public string Guid { get; set; }
        [DataMember]
        public string CreateTime { get; set; }
        [DataMember]
        public string DeleteTime { get; set; }
        [DataMember]
        public string Station { get; set; }
        [DataMember]
        public string Slot { get; set; }
        [DataMember]
        public string LaserMarker { get; set; }
        [DataMember]
        public string T7Code { get; set; }

        [DataMember]
        public string CarrierGuid { get; set; }

        [DataMember]
        public string WaferId { get; set; }
    }
    [DataContract]
    [Serializable]
    public class HistoryMoveData
    {
        [DataMember]
        public string WaferGuid { get; set; }
        [DataMember]
        public string ArriveTime { get; set; }
        [DataMember]
        public string Station { get; set; }
        [DataMember]
        public string Slot { get; set; }
        [DataMember]
        public string Result { get; set; }
    }

    [DataContract]
    [Serializable]
    public class HistoryJobMoveData
    {
        [DataMember]
        public string JobGuid { get; set; }
        [DataMember]
        public string Station { get; set; }
        [DataMember]
        public string ArriveTime { get; set; }
        [DataMember]
        public string LeaveTime { get; set; }

    }
    [DataContract]
    [Serializable]
    public class HistoryBatData
    {
        [DataMember]
        public string Guid { get; set; }
        [DataMember]
        public string StartTime { get; set; }
        [DataMember]
        public string EndTime { get; set; }
        [DataMember]
        public string RecipeName { get; set; }
        [DataMember]
        public string Result { get; set; }
    }

    [DataContract]
    [Serializable]
    public class HistoryFfuDiffPressureData
    {
        [DataMember]
        public string Time { get; set; }
        [DataMember]
        public string FFU1Speed { get; set; }
        [DataMember]
        public string FFU2Speed { get; set; }
        [DataMember]
        public string DiffPressure1 { get; set; }
        [DataMember]
        public string DiffPressure2 { get; set; }
    }

    public interface ITreeItem<T> where T : ITreeItem<T>, new()
    {
        string ID { set; get; }
    }

    [DataContract]
    [Serializable]
    public enum WaferHistoryItemType
    {
        [EnumMember]
        None,
        [EnumMember]
        Lot,
        [EnumMember]
        Wafer,
        [EnumMember]
        Recipe
    }
    public class Anychange
    {
        public static string menuname { get; set; } 
        public static bool needchange { get; set; } = false;
        public static WaferHistoryWafer args { get; set;}
    }

    [DataContract]
    [Serializable]
    public class WaferHistoryMovement
    {
        [DataMember]
        public string Source { get; set; }
        [DataMember]
        public string Destination { get; set; }
        [DataMember]
        public string InTime { get; set; }
    }

    [DataContract]
    [Serializable]
    public class WaferHistoryWafer : WaferHistoryItem
    {
        [DataMember]
        public string ProcessJob { get; set; }

        public string WaferGuid { get; set; }
        [DataMember]
        public string Sequence { get; set; }

        [DataMember]
        public string Status { get; set; }
        public DateTime? ProcessStartTime { get; set; }
        [DataMember]
        public DateTime? ProcessEndTime { get; set; }
        //[DataMember]
        //public string LotID { get; set; }
        [DataMember]
        public string SlotID { get; set; }
        public string ProcessDuration
        {
            get
            {

                if (!ProcessStartTime.HasValue || !ProcessEndTime.HasValue) return string.Empty;
                return ProcessEndTime.Value.Subtract(ProcessStartTime.Value).ToString(@"hh\:mm\:ss");
            }
        }
    }

    [DataContract]
    [Serializable]
    public class RecipeStep
    {
        [DataMember]
        public int No { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public DateTime StartTime { get; set; }
        [DataMember]
        public DateTime EndTime { get; set; }
        [DataMember]
        public string ActualTime { get; set; }
        [DataMember]
        public string SettingTime { get; set; }
    }

    [DataContract]
    [Serializable]
    public class RecipeStepFdcData
    {
        [DataMember]
        public int StepNumber { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public float SetPoint { get; set; }

        [DataMember]
        public int SampleCount { get; set; }

        [DataMember]
        public float MinValue { get; set; }

        [DataMember]
        public float MaxValue { get; set; }

        [DataMember]
        public float StdValue { get; set; }

        [DataMember]
        public float MeanValue { get; set; }
    }

    [DataContract]
    [Serializable]
    public class WaferHistoryRecipe : WaferHistoryItem
    {
        [DataMember]
        public string Chamber { get; set; }
        [DataMember]
        public string Recipe { get; set; }
        [DataMember]
        public string SettingTime { get; set; }
        [DataMember]
        public string ActualTime { get; set; }
        [DataMember]
        public List<RecipeStep> Steps { get; set; }

        [DataMember]
        public List<RecipeStepFdcData> Fdcs { get; set; }
    }

    public class WaferHistoryRecipe2 : WaferHistoryItem
    {
        [DataMember]
        public string Chamber { get; set; }
        [DataMember]
        public string Recipe { get; set; }
        [DataMember]
        public string SettingTime { get; set; }
        [DataMember]
        public string ActualTime { get; set; }
        [DataMember]
        public List<RecipeStep> Steps { get; set; }

        public object SelectedLot { get; set; }
        public object SelectedWafer { get; set; }
        public object SelectedProcess { get; set; }
        public bool IsToCompare { get; set; } = false;
        public object Cache { get; set; }// 临时的
    }
    [DataContract]
    [Serializable]
    public class WaferHistoryLot : WaferHistoryItem
    {
        [DataMember]
        public string CarrierID { get; set; }
        [DataMember]
        public string Rfid { get; set; }
        [DataMember]
        public string InputPort { get; set; }
        [DataMember]
        public int WaferCount { get; set; }
        [DataMember]
        public int FaultWaferCount { get; set; }
    }

    [DataContract]
    [Serializable]
    public class WaferHistorySecquence : WaferHistoryItem
    {
        [DataMember]
        public string SecquenceName { get; set; }
        [DataMember]
        public string Recipe { get; set; }
        [DataMember]
        public string SecQuenceStartTime { get; set; }
        [DataMember]
        public string SecQuenceEndTime { get; set; }
        [DataMember]
        public string ActualTime { get; set; }
    }
    [DataContract]
    [Serializable]
    public class WaferHistoryItem : ITreeItem<WaferHistoryItem>
    {
        [DataMember]
        public WaferHistoryItemType Type { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string ID { get; set; }
        [DataMember]
        public DateTime StartTime { get; set; }
        [DataMember]
        public DateTime EndTime { get; set; }
        public string Duration => EndTime.CompareTo(StartTime) < 0 ? "" : EndTime.Subtract(StartTime).ToString(@"hh\:mm\:ss");
        public string ItemInfo => string.IsNullOrEmpty(Name) ? "" : Name;
        [DataMember]
        public ITreeItem<WaferHistoryItem> SubItems { get; set; }
        [DataMember]
        public string RfID { get; set; }
        [DataMember]
        public string LotID { get; set; }
    }

    [DataContract]
    [Serializable]
    public class WaferHistoryMetrology
    {
        [DataMember]
        public string dataname { get; set; }
        [DataMember]
        public string datavalue { get; set; }
        [DataMember]
        public string processtime { get; set; }
        [DataMember]
        public string stationname { get; set; }
    }
    [DataContract]
    [Serializable]
    public class FdcDataItem
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public float MaxValue { get; set; }

        [DataMember]
        public float MinValue { get; set; }

        [DataMember]
        public float MeanValue
        {
            get
            {
                if (SampleCount == 0)
                    return 0f;
                return Total / SampleCount;
            }
        }

        [DataMember]
        public float StdValue
        {
            get
            {
                if (SampleCount <= 1)
                    return 0f;
                return (float)Math.Sqrt(Math.Abs((SqrtTotal - 2 * (Total / SampleCount) * Total + SampleCount * (Total / SampleCount) * (Total / SampleCount)) / (SampleCount - 1)));
            }
        }

        [DataMember]
        public float SetPoint { get; set; }

        [DataMember]
        public float Total { get; set; }

        [DataMember]
        public float SqrtTotal { get; set; }

        [DataMember]
        public int SampleCount { get; set; }

        public void Clear()
        {
            MaxValue = float.MinValue;
            MinValue = float.MaxValue;
            SetPoint = 0f;
            Total = 0f;
            SampleCount = 0;
            SqrtTotal = 0f;

        }

        public void Update(float value)
        {
            if (value < MinValue)
                MinValue = value;

            if (value > MaxValue)
                MaxValue = value;

            Total += value;

            SqrtTotal += value * value;

            SampleCount++;
        }

        public FdcDataItem Clone()
        {
            var data  = new FdcDataItem();
            data.SetPoint = SetPoint;
            data.MaxValue = MaxValue;
            data.MinValue = MinValue;
            data.SampleCount = SampleCount;
            data.SqrtTotal = SqrtTotal;
            data.Total = Total;
            data.Name = Name;
            return data;
        }
    }
}