using Aitex.Core.Common;
using Aitex.Core.UI.MVVM;
using MECF.Framework.Common.CommonData.Metal;
using MECF.Framework.Common.CommonData.PowerSupplier;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.Persistent.Reservoirs;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.ToolLayout;
using MECF.Framework.Common.Utilities;
using MECF.Framework.Common.WaferHolder;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Windows.Threading;

namespace CyberX8_MainPages.ViewModels
{
    internal class MetalCMHomePageViewModel : BindableBase
    {
        #region 常量
        private const string PUMP_DATA = "PumpData";
        private const string PERSISTENT_VALUE = "PersistentValue";
        #endregion

        #region 内部变量

        #region Common
        /// <summary>
        /// 模块名称
        /// </summary>
        private string _module;
        /// <summary>
        /// 当前选择Recipe节点
        /// </summary>
        private RecipeNode _selectedRecipeNode;
        /// <summary>
        /// MetalData
        /// </summary>
        //private MetalData _metalCommonData;
        /// <summary>
        /// Persistent
        /// </summary>
        private MetalPersistentValue _metalPersistent;
        /// <summary>
        /// RinseItem
        /// </summary>
        private MetalItem _metalItem;
        /// <summary>
        /// WaferSize
        /// </summary>
        private WaferSize _selectedWaferSize = 0;
        /// <summary>
        /// Wafer Size List
        /// </summary>
        private List<int> _waferSizeList = new List<int>();
        /// <summary>
        /// MetalData
        /// </summary>
        private CompactMembranMetalDeviceData _metalData;
        /// <summary>
        /// 页面功能启用
        /// </summary>
        private bool _isEnabled;
        /// <summary>
        /// AutoMode页面功能启用
        /// </summary>
        private bool _isAutoEnabled;
        #endregion

        #region Wafer Holder
        /// <summary>
        /// Wafer Holder属性
        /// </summary>
        private WaferHolderInfo _waferHolderInfo;
        /// <summary>
        /// SeqRecipe
        /// </summary>
        private string _seqRecipe;
        #endregion

        #region 系统数据
        /// <summary>
        /// 定时器
        /// </summary>
        DispatcherTimer _timer;
        /// <summary>
        /// 查询后台数据集合
        /// </summary>
        private List<string> _rtDataKeys = new List<string>();
        /// <summary>
        /// rt查询key数值字典
        /// </summary>
        private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();
        #endregion

        #region MetalCM
        /// <summary>
        /// RecipeContent
        /// </summary>
        private string _recipeContent;
        /// <summary>
        /// TimeRemaining 
        /// </summary>
        private double _timeRemaining;
        /// <summary>
        /// OfTotalTime 
        /// </summary>
        private double _totalTime;
        /// <summary>
        /// OperatingMode 
        /// </summary>
        private string _operatingMode;
        /// <summary>
        /// State
        /// </summary>
        private string _state;
        /// <summary>
        /// RecipeMode 
        /// </summary>
        private string _recipeMode;
        #endregion

        #region Metal recipe
        /// <summary>
        /// RecipeModuleName
        /// </summary>
        private string _recipeModuleName;
        /// <summary>
        /// RecipeType
        /// </summary>
        private string _recipeType;
        /// <summary>
        /// AchievedRunRecipeCycle
        /// </summary>
        private int _achievedRunRecipeCycle;
        /// <summary>
        /// 当前Recipe
        /// </summary>
        private string _currentRecipe;
        #endregion

        #region UI Related
        /// <summary>
        /// ClampStatus
        /// </summary>
        private string _clampStatus;      
        /// <summary>
        /// IsErrorState
        /// </summary>
        private bool _isErrorState;
        #endregion

        #region PowerSupplier
        /// <summary>
        /// SidA PowerSuplier数据
        /// </summary>
        private PowerSupplierData _sideAPowerSupplierData;
        /// <summary>
        /// SidB PowerSuplier数据
        /// </summary>
        private PowerSupplierData _sideBPowerSupplierData;
        /// <summary>
        /// 是否存在WaferHolder
        /// </summary>
        private bool _isWaferHolder;
        #endregion

        #region CellStatus
        /// <summary>
        /// Anode SideA Flow
        /// </summary>
        private double _anodeSideAFlow;
        /// <summary>
        /// Anode SideB Flow
        /// </summary>
        private double _anodeSideBFlow;
        /// <summary>
        /// Anode SideA Status
        /// </summary>
        private string _anodeSideAStatus;
        /// <summary>
        /// Anode SideB Status
        /// </summary>
        private string _anodeSideBStatus;
        #endregion
        #endregion

        #region 属性

        #region Common
        /// <summary>
        /// MetalData
        /// </summary>
        public CompactMembranMetalDeviceData MetalData
        {
            get { return _metalData; }
            set { SetProperty(ref _metalData, value); }
        }
        /// <summary>
        /// Persistent
        /// </summary>
        public MetalPersistentValue MetalPersistent
        {
            get { return _metalPersistent; }
            set { SetProperty(ref _metalPersistent, value); }
        }
        /// <summary>
        /// 模块名称
        /// </summary>       
        public string Module { 
            get { return _module; } 
            set { SetProperty(ref _module, value); }
        }
        /// <summary>
        /// 当前选择Recipe节点
        /// </summary>
        public RecipeNode SelectedRecipeNode
        {
            get { return _selectedRecipeNode; }
            set { SetProperty(ref _selectedRecipeNode, value); }
        }
        /// <summary>
        /// WaferSize
        /// </summary>
        public WaferSize SelectedWaferSize
        {
            get { return _selectedWaferSize; }
            set { SetProperty(ref _selectedWaferSize, value); }
        }
        /// <summary>
        /// WaferSizeList
        /// </summary>
        public List<int> WaferSizeList
        {
            get { return _waferSizeList; }
            set { SetProperty(ref _waferSizeList, value); }
        }
        /// <summary>
        /// 页面功能启用
        /// </summary>
        public bool IsEnabled
        {
            get { return _isEnabled; }
            set { SetProperty(ref _isEnabled, value); }
        }
        /// <summary>
        /// AutoMode页面功能启用
        /// </summary>
        public bool IsAutoEnabled
        {
            get { return _isAutoEnabled; }
            set { SetProperty(ref _isAutoEnabled, value); }
        }
        #endregion

        #region Wafer Holder
        /// <summary>
        /// Wafer Holder属性
        /// </summary>
        public WaferHolderInfo WaferHolderInfo { get { return _waferHolderInfo; } set { SetProperty(ref _waferHolderInfo, value); } }
        /// <summary>
        /// SeqRecipe
        /// </summary>
        public string SeqRecipe
        {
            get { return _seqRecipe; }
            set { SetProperty(ref _seqRecipe, value); }
        }

        #endregion

        #region MetalCM
        /// <summary>
        /// RecipeContent
        /// </summary>
        public string RecipeContent
        {
            get { return _recipeContent; }
            set { SetProperty(ref _recipeContent, value); }
        }
        /// <summary>
        /// TimeRemaining 
        /// </summary>
        public double TimeRemaining
        {
            get { return _timeRemaining; }
            set { SetProperty(ref _timeRemaining, value); }
        }
        /// <summary>
        /// TotalTime  
        /// </summary>
        public double TotalTime
        {
            get { return _totalTime; }
            set { SetProperty(ref _totalTime, value); }
        }
        /// <summary>
        /// OperatingMode
        /// </summary>
        public string OperatingMode
        {
            get { return _operatingMode; }
            set { SetProperty(ref _operatingMode, value); }
        }
        /// <summary>
        /// State
        /// </summary>
        public string State
        {
            get { return _state; }
            set { SetProperty(ref _state, value); }
        }
        /// <summary>
        /// RecipeMode
        /// </summary>
        public string RecipeMode
        {
            get { return _recipeMode; }
            set { SetProperty(ref _recipeMode, value); }
        }
        #endregion

        #region Metal recipe
        /// <summary>
        /// RecipeModuleName
        /// </summary>
        public string RecipeModuleName
        {
            get { return _recipeModuleName; }
            set { SetProperty(ref _recipeModuleName, value); }
        }
        /// <summary>
        /// RecipeType
        /// </summary>
        public string RecipeType
        {
            get { return _recipeType; }
            set { SetProperty(ref _recipeType, value); }
        }
        /// <summary>
        /// Run Recipe已经完成的次数
        /// </summary>
        public int AchievedRunRecipeCycle
        {
            get { return _achievedRunRecipeCycle; }
            set { SetProperty(ref _achievedRunRecipeCycle, value); }
        }
        /// <summary>
        /// 当前Recipe
        /// </summary>
        public string CurrentRecipe
        {
            get { return _currentRecipe; }
            set { SetProperty(ref _currentRecipe, value); }
        }
        #endregion

        #region UI Related
        /// <summary>
        /// IsErrorState
        /// </summary>
        public bool IsErrorState
        { 
            get { return _isErrorState; }
            set { SetProperty(ref _isErrorState, value); } 
        }
        /// <summary>
        /// ClampStatus
        /// </summary>
        public string ClampStatus
        {
            get { return _clampStatus; }
            set { SetProperty(ref _clampStatus, value); }
        }
        #endregion

        #region PowerSupplier
        /// <summary>
        /// SidA PowerSuplier数据
        /// </summary>
        public PowerSupplierData SideAPowerSupplierData
        {
            get { return _sideAPowerSupplierData; }
            set { SetProperty(ref _sideAPowerSupplierData, value); }
        }
        /// <summary>
        /// SidB PowerSuplier数据
        /// </summary>
        public PowerSupplierData SideBPowerSupplierData
        {
            get { return _sideBPowerSupplierData; }
            set { SetProperty(ref _sideBPowerSupplierData, value); }
        }
        /// <summary>
        /// 是否存在WaferHolder
        /// </summary>
        public bool IsWaferHolder 
        { 
            get { return _isWaferHolder; } 
            set { SetProperty(ref _isWaferHolder, value); } 
        }
        #endregion

        #region CellStatus
        /// <summary>
        /// Anode SideA Flow
        /// </summary>
        public double AnodeSideAFlow
        {
            get { return _anodeSideAFlow; }
            set { SetProperty(ref _anodeSideAFlow, value); }
        }
        /// <summary>
        /// Anode SideB Flow
        /// </summary>
        public double AnodeSideBFlow
        {
            get { return _anodeSideBFlow; }
            set { SetProperty(ref _anodeSideBFlow, value); }
        }
        /// <summary>
        /// Anode SideA Status
        /// </summary>
        public string AnodeSideAStatus
        {
            get { return _anodeSideAStatus; }
            set { SetProperty(ref _anodeSideAStatus, value); }
        }
        /// <summary>
        /// Anode SideB Status
        /// </summary>
        public string AnodeSideBStatus
        {
            get { return _anodeSideBStatus; }
            set { SetProperty(ref _anodeSideBStatus, value); }
        }
        #endregion
        #endregion

        #region Command指令
        public ICommand InitializeCommand { get; set; }
        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        public MetalCMHomePageViewModel()
        {
            InitializeCommand = new DelegateCommand<object>(InitializeAction);
            WaferSizeList.Add((int)WaferSize.WS8);
            WaferSizeList.Add((int)WaferSize.WS12);
        }

        /// <summary>
        /// 加载数据
        /// </summary>
        public void LoadData(string systemName)
        {
            Module = systemName;
            RecipeModuleName = "DEP Recipe";
            RecipeType = "dep";
            _rtDataKeys.Clear();
            _rtDataKeys.Add($"{Module}.WaferHolder");
            _rtDataKeys.Add($"{Module}.SequenceRecipe");
            _rtDataKeys.Add($"{Module}.AchievedCycle");
            _rtDataKeys.Add($"{Module}.FsmState");
            _rtDataKeys.Add($"{Module}.MetalData");
            _rtDataKeys.Add($"{Module}.{PERSISTENT_VALUE}");
            _rtDataKeys.Add($"{Module}.SideAPowerSupplierData");
            _rtDataKeys.Add($"{Module}.SideBPowerSupplierData");
            _rtDataKeys.Add($"{Module}.SideAFlow");
            _rtDataKeys.Add($"{Module}.SideAFlowStatus");
            _rtDataKeys.Add($"{Module}.SideBFlow");
            _rtDataKeys.Add($"{Module}.SideBFlowStatus");
            _rtDataKeys.Add($"{Module}.CurrentRecipe");
            _rtDataKeys.Add($"{Module}.TotalTime");
            _rtDataKeys.Add($"{Module}.TimeRemain");

            if (_timer == null)
            {
                _timer = new DispatcherTimer();
                _timer.Interval = TimeSpan.FromMilliseconds(200);
                _timer.Tick += Timer_Tick;
            }
            _timer.Start();
        }
        /// <summary>
        /// 定时器执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Tick(object sender, EventArgs e)
        {
            if (_rtDataKeys.Count != 0)
            {
                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
                if (_rtDataValueDic != null)
                {
                    MetalData = CommonFunction.GetValue<CompactMembranMetalDeviceData>(_rtDataValueDic, $"{Module}.MetalData");
                    MetalPersistent = CommonFunction.GetValue<MetalPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
                    ClampStatus = true ? "Disconnect":(false ? "Clamped" : "Unclamped");
                    WaferHolderInfo = CommonFunction.GetValue<WaferHolderInfo>(_rtDataValueDic, $"{Module}.WaferHolder");
                    if (WaferHolderInfo != null)
                    {
                        IsWaferHolder = true;
                    }
                    else
                    {
                        IsWaferHolder = false;
                    }
                    SeqRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SequenceRecipe");
                    AchievedRunRecipeCycle = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.AchievedCycle");
                    State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
                    if ("Manual".Equals(MetalPersistent.OperatingMode))
                    {
                        IsEnabled = true;
                        IsAutoEnabled = true;
                    }
                    else if ("Auto".Equals(MetalPersistent.OperatingMode))
                    {
                        IsAutoEnabled = true;
                        IsEnabled = false;
                    }
                    else
                    {
                        State = "Stopped";
                        IsEnabled = false;
                        IsAutoEnabled = false;
                    }
                    SideAPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValueDic, $"{Module}.SideAPowerSupplierData");
                    SideBPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValueDic, $"{Module}.SideBPowerSupplierData");
                    AnodeSideAFlow = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.SideAFlow");
                    AnodeSideBFlow = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.SideBFlow");
                    AnodeSideAStatus = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SideAFlowStatus");
                    AnodeSideBStatus = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SideBFlowStatus");
                    //Error时UI腔体变红
                    IsErrorState = "Error".Equals(State) ? true : false;
                    //WHClamp control
                    if(MetalData != null)
                    {
                        ClampStatus = MetalData.WHUnclamp ? "Unclamped" : (MetalData.WHClamp ? "Clamped" : "Disconnect");
                    }
                    CurrentRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentRecipe");
                    TotalTime = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TotalTime");
                    TimeRemaining = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TimeRemain");
                    TimeRemaining = TimeRemaining < 0 ? 0 : TimeRemaining;
                    if (State == "Idle")
                    {
                        TimeRemaining = 0;
                    }
                }
            }
        }
        /// <summary>
        /// 隐藏
        /// </summary>
        public void Hide()
        {
            if (_timer != null)
            {
                _timer.Stop();
            }
        }
        /// <summary>
        /// Initialize Action
        /// </summary>
        /// <param name="param"></param>
        private void InitializeAction(object param)
        {
            InvokeClient.Instance.Service.DoOperation($"{Module}.InitializeAll");
        }
    }
}