using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml.Serialization;

namespace Aitex.Core.Util
{
    //Some common data structure are defined here for data transfer between server and client 
    //via serialization and deserialization

    /// <summary>
    /// Analog device data
    /// </summary>
    [DataContract]
    [Serializable]
    public class AnalogDeviceData
    {
        [DataMember]
        public string TechnicalName { get; set; }

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

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

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

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

        /// <summary>
        /// 量程
        /// </summary>
        [DataMember]
        public double Scale { get; set; }

        /// <summary>
        /// 设定值
        /// </summary>
        [DataMember]
        public double SetPoint { get; set; }

        /// <summary>
        /// 实际反馈值
        /// </summary>
        [DataMember]
        public double FeedBack { get; set; }

        /// <summary>
        /// 默认值
        /// </summary>
        [DataMember]
        public double DefaultValue { get; set; }

        /// <summary>
        /// 是否有报警
        /// </summary>
        [DataMember]
        public bool IsWarning { get; set; }

        /// <summary>
        /// alarm或是erro时显示的信息
        /// </summary>
        [DataMember]
        public string ErroMessage { get; set; }

        private double _factor = 1.0;

        [DataMember]
        public double Factor { get { return _factor; } set { _factor = value; } }

        public override string ToString()
        {
            return FeedBack.ToString();
        }

        /// <summary>
        /// Default constructor.
        /// </summary>
        public AnalogDeviceData()
        {
        }

        /// <summary>
        /// Copy constructor of this object.
        /// </summary>
        /// <param name="deviceData"></param>
        public AnalogDeviceData(AnalogDeviceData deviceData)
        {
            TechnicalName = deviceData.TechnicalName;

            DeviceName = deviceData.DeviceName;

            DeviceId = deviceData.DeviceId;

            Unit = deviceData.Unit;

            Description = deviceData.Description;

            Scale = deviceData.Scale;

            SetPoint = deviceData.SetPoint;

            FeedBack = deviceData.FeedBack;

            DefaultValue = deviceData.DefaultValue;

            IsWarning = deviceData.IsWarning;

            ErroMessage = deviceData.ErroMessage;
        }
    }

    //public interface IAnalogData
    //{
    //    AnalogDeviceData GetData(string deviceId);
    //}

    /// <summary>
    /// Digital device data
    /// </summary>
    [DataContract]
    [Serializable]
    public class DigitalDeviceData
    {
        [DataMember]
        public string TechnicalName { get; set; }

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

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

        /// <summary>
        /// 当前设定值
        /// </summary>
        [DataMember]
        public bool SetValue { get; set; }

        /// <summary>
        /// 默认值
        /// </summary>
        [DataMember]
        public bool DefaultValue { get; set; }

        /// <summary>
        /// 实际反馈值
        /// </summary>
        [DataMember]
        public bool Feedback { get; set; }

        public override string ToString()
        {
            return Feedback.ToString();
        }
    }

    //public interface IDigitalData
    //{
    //    DigitalDeviceData GetData(string deviceId);
    //}

    ///// <summary>
    ///// Reactor data
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class ReactorData
    //{
    //    public ReactorData()
    //    {
    //        MFC = new SerializableDictionary<string, AnalogDeviceData>();
    //        PC = new SerializableDictionary<string, AnalogDeviceData>();
    //        Valve = new SerializableDictionary<string, DigitalDeviceData>();
    //        ProcessData = new SerializableDictionary<string, string>();
    //    }

    //    /// <summary>
    //    /// Class members
    //    /// </summary>
    //    public SerializableDictionary<string, AnalogDeviceData> MFC;

    //    /// <summary>
    //    /// Class members
    //    /// </summary>
    //    public SerializableDictionary<string, AnalogDeviceData> PC;

    //    /// <summary>
    //    /// Class members
    //    /// </summary>
    //    public SerializableDictionary<string, DigitalDeviceData> Valve;

    //    /// <summary>
    //    /// Class members
    //    /// </summary>       
    //    public SerializableDictionary<string, string> ProcessData;
    //}

    ///// <summary>
    ///// Heater data
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class HeaterData
    //{
    //    public bool Enable;
    //    public bool PsuEnable;
    //    public HeaterMode Mode;
    //    public double[] ZoneTempFeedback;
    //    public double[] ZoneCurrentFeedback;
    //    public double[] ZonePowerFeedback;
    //    public double[] ZoneTcFeedback;

    //    //public double[] PSU_Current_Read;
    //    public double[] Zone_Voltage_Read;
    //    public double[] Current_SetPoint;
    //}

    ///// <summary>
    ///// Pressure data
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class PressureData
    //{
    //    public bool ThrottleValveEnable;
    //    public bool MainPumpEnable;
    //    public PressureControlMode Mode;

    //    /// <summary>
    //    /// pres real data
    //    /// </summary>
    //    public double TVPresFeedback;   //throttle valve pressure feedback
    //    public double TVPresSetPoint;

    //    public double PT1Feedback;
    //    public double PT2Feedback;
    //    public double ThrottleValveOpenRate;
    //    public int TV_Status;
    //}

    ///// <summary>
    ///// System monitor view data
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class SystemMonitorViewData
    //{
    //    /// <summary>
    //    /// Susceptor infors
    //    /// </summary>
    //    public SerializableDictionary<ChamberSet, SusceptorInfo> ChamberSusceptorInfos
    //    {
    //        get;
    //        set;
    //    }

    //    public SerializableDictionary<ChamberSet, ChamberCommStateEnum> ChamberCommStates;

    //    /// <summary>
    //    /// IsServiceModeA
    //    /// </summary>
    //    public bool IsServiceModeA
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// IsServiceModeB
    //    /// </summary>
    //    public bool IsServiceModeB
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// IsServiceModeC
    //    /// </summary>
    //    public bool IsServiceModeC
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// IsServiceModeD
    //    /// </summary>
    //    public bool IsServiceModeD
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// IsServiceRunningLoadlock
    //    /// </summary>
    //    public bool IsServiceRunningLoadlock
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// IsServiceRunningTransfer
    //    /// </summary>
    //    public bool IsServiceRunningTransfer
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor processing?
    //    /// </summary>
    //    public bool IsProcessingA
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor processing?
    //    /// </summary>
    //    public bool IsProcessingB
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor processing?
    //    /// </summary>
    //    public bool IsProcessingC
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor processing?
    //    /// </summary>
    //    public bool IsProcessingD
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor susceptor rotation?
    //    /// </summary>
    //    public bool IsRotatingA
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor susceptor rotation?
    //    /// </summary>
    //    public bool IsRotatingB
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor susceptor rotation?
    //    /// </summary>
    //    public bool IsRotatingC
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is reactor susceptor rotation?
    //    /// </summary>
    //    public bool IsRotatingD
    //    {
    //        get;
    //        set;
    //    }
    
    //    /// <summary>
    //    /// Robot data
    //    /// </summary>
    //    public double RobotTheta
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Robot data
    //    /// </summary>
    //    public double RobotRadius
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Is sequencer running
    //    /// </summary>
    //    public bool SequencerRunning
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// Chamber information
    //    /// </summary>
    //    public string PMA_Info
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Chamber information
    //    /// </summary>
    //    public string PMB_Info
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Chamber information
    //    /// </summary>
    //    public string PMC_Info
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Chamber information
    //    /// </summary>
    //    public string PMD_Info
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// chamber door state
    //    /// </summary>
    //    public int IsPMADoorOpen
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// chamber door state
    //    /// </summary>
    //    public int IsPMBDoorOpen
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// chamber door state
    //    /// </summary>
    //    public int IsPMCDoorOpen
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// chamber door state
    //    /// </summary>
    //    public int IsPMDDoorOpen
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// LL door state
    //    /// </summary>
    //    public int IsLLDoorOpen
    //    {
    //        get;
    //        set;
    //    }

    //    public bool IsLLDoorEverOpened
    //    {
    //        get;
    //        set;
    //    }
    //    /// <summary>
    //    /// Loadlock door latch state
    //    /// </summary>
    //    public int IsLLDoorLatched
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMA pressure
    //    /// </summary>
    //    public double PMA_Pres
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMB pressure
    //    /// </summary>
    //    public double PMB_Pres
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMC pressure
    //    /// </summary>
    //    public double PMC_Pres
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMD pressure
    //    /// </summary>
    //    public double PMD_Pres
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// TM pressure
    //    /// </summary>
    //    public double TM_Pres
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// LL pressure
    //    /// </summary>
    //    public double LL_Pres
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMA temperature
    //    /// </summary>
    //    public double PMA_Temp
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMB temperature
    //    /// </summary>
    //    public double PMB_Temp
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMC temperature
    //    /// </summary>
    //    public double PMC_Temp
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// PMD temperature
    //    /// </summary>
    //    public double PMD_Temp
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// Cooldown temperature
    //    /// </summary>
    //    public double CoolDown_Temp
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// LL temperature
    //    /// </summary>
    //    public double LL_Temp
    //    {
    //        get;
    //        set;
    //    }

    //    /// <summary>
    //    /// current cycle
    //    /// </summary>
    //    public int TheIthCycle { get; set; }

    //    public int CycleCount { get; set; }

    //    public bool IsCycleMode { get; set; }
    //}

    ///// <summary>
    ///// Config data structure
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class ConfigEntry
    //{
    //    public ChamberSet ChamId { get; set; }
    //    public string SectionName { get; set; }
    //    public string EntryName { get; set; }
    //    public string Description { get; set; }
    //    public string Type { get; set; }
    //    public string Unit { get; set; }
    //    public string Value { get; set; }
    //    public string Default { get; set; }
    //    public string RangeLowLimit { get; set; }
    //    public string RangeUpLimit { get; set; }
    //    public string XPath { get; set; }
    //}

    ///// <summary>
    ///// 显示数据只包含时间和数值
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class ChartShowInfo
    //{
    //    public string TimeString { get; set; }
    //    public DateTime Time { get; set; }
    //    public double Value { get; set; }
    //}

    //[DataContract]
    //[Serializable]
    //public class TransferData
    //{
    //    public bool DorDPressSwitch;
    //    public bool DorCPressSwitch;
    //    public bool DorBPressSwitch;
    //    public bool DorAPressSwitch;
    //    public bool TubePressSwitch;
    //    public bool DoubleOringPump;
    //    public bool TmDryPump;
    //    public bool? TmPumpRun;
    //    public bool TmPumpAlarm;

    //    public bool TransferFastPumpClose;
    //    public bool TransferSlowPumpClose;
    //}

    //[DataContract]
    //[Serializable]
    //public class LoadLockData
    //{
    //    public bool LoadLockFastPumpClose;
    //    public bool LoadLockSlowPumpClose;

    //    public bool GateIsOpen;
    //    public bool DoorClose;
    //    public double Temperature;
    //    public double Pressure;
    //    public bool AtAtm;
    //    public bool UnderVacuum;
    //}

    ///// <summary>
    ///// Reactor's bubbler data 
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class BubblerData
    //{
    //    /// <summary>
    //    /// 名称
    //    /// </summary>
    //    public string MoName { get; set; }
    //    /// <summary>
    //    /// 总量
    //    /// </summary>
    //    public double TotalWeight { get; set; }
    //    /// <summary>
    //    /// 计算使用量
    //    /// </summary>
    //    public double IntegralUsedWeight { get; set; }
    //    /// <summary>
    //    /// 计算因子
    //    /// </summary>
    //    public double MoCalcFactor { get; set; }
    //    /// <summary>
    //    /// 报警阈值
    //    /// </summary>
    //    public double MoAlarmLimit { get; set; }
    //    /// <summary>
    //    /// 实际使用量
    //    /// </summary>
    //    public double MoUsedWeight { get; set; }
    //    /// <summary>
    //    /// 实际剩余量
    //    /// </summary>
    //    public double MoRemainedWeight { get; set; }
    //    /// <summary>
    //    /// MO剩余百分比
    //    /// </summary>
    //    public string MoRemainedPercentage { get; set; }

    //    /// <summary>
    //    /// Bubble温度
    //    /// </summary>
    //    public double BubbleTemp { get; set; }

    //    /// <summary>
    //    /// 平均每分钟的MO消耗质量
    //    /// </summary>
    //    public double AveragedMoWeightLostPerMin { get; set; }
    //}

    ///// <summary>
    ///// 模块监控单元的状态定义
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public enum ModuleMonitorItemStatus
    //{
    //    Alarm,
    //    NoAlarm,
    //    Active,
    //    NoActive
    //}

    ///// <summary>
    ///// 模块监控单元
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class ModuleMonitorItem
    //{
    //    public string ModuleName { get; set; }
    //    public string Description { get; set; }
    //    public ModuleMonitorItemStatus Status { get; set; }
    //}

    ///// <summary>
    ///// 
    ///// </summary>
    //[DataContract]
    //[Serializable]
    //public class ChartSaveData
    //{
    //    public DateTime RecordTime;
    //    public double tvPresData;
    //    public double ZoneA_TC_Read, ZoneB_TC_Read, ZoneC_TC_Read, ZoneD_TC_Read;
    //    public double ZoneA_Current_Read, ZoneB_Current_Read, ZoneC_Current_Read, ZoneD_Current_Read;
    //}

    //[DataContract]
    //[Serializable]
    //public enum ServerRoutineState
    //{ 
    //    NotRun,
    //    ZhenKong,
    //    Vent,
    //    CyclePurge,
    //    LeakCheck,

    //}

    [Serializable]
    public class DataItem
    {
        public string DataName { get; set; }
        //public bool IsPreLoaded { get; set; }
        public List<DateTime> TimeStamp { get; set; }
        public List<float> RawData { get; set; }
    }

    /// <summary>
    /// archived data format
    /// </summary>
    [Serializable]
    public class ArchivedFile
    {
        public string ChamId { get; set; }
        public string Description { get; set; }
        public DateTime BeginTime { get; set; }
        public DateTime EndTime { get; set; }
        public Dictionary<string, DataItem> Datas { get; set; }
        public Dictionary<string, List<string>> AliasList { get; set; }
        public List<KeyValuePair<DateTime, string>> RecipeSteps { get; set; }
    }

    #region PM data
    /// <summary>
    /// 标识不需要数据库记录的数据类型
    /// </summary>
    [AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field)]
    public class DatabaseSaveIgnoreAttribute : Attribute { }

    [Serializable]
    [DataContract]
    public class BathData
    {
        [XmlAttribute]
        public string BathName;
        public bool IsCommErr;
        public bool IsOutofTempRange;
        [DatabaseSaveIgnore]
        public bool IsTempSignalAlarm;
        [DatabaseSaveIgnore]
        public bool IsCutoffAlarm;
        [DatabaseSaveIgnore]
        public bool IsLevelWarning;
        public double TemperatureReading;
    }

    [Serializable]
    [DataContract]
    public class MoLine
    {
        [XmlAttribute]
        public string MoName;
        [DatabaseSaveIgnore]
        public bool IsDummyMo;
        //public bool IsBathTempAbnormal;
        //public double BathTemperatureReading;
        [DatabaseSaveIgnore]
        public double MoAlarmLimit;
        public double MoTotalWeight;
        [DatabaseSaveIgnore]
        public double MoWeightCalFactor;
        public double IntegralUsedWeight;
        public bool IsMoRemainedWeightAlarm;
        [DatabaseSaveIgnore]
        public double MoRemainedPercentage;
        [DatabaseSaveIgnore]
        public double MoRemainedWeight;
        public double MoUsedWeight;
        public double ToChamFlowRate;
        [DatabaseSaveIgnore]
        public double AveragedMoWeightLostPerMin;/*平均每分钟的MO消耗量计算值*/
        [DatabaseSaveIgnore]
        public BathData Bath;
        public override string ToString()
        {
            return MoName;
        }
    }
    #endregion

}