using Aitex.Core.Common.DeviceData;
using Aitex.Core.Util;
using Caliburn.Micro;
using Caliburn.Micro.Core;
using FurnaceUI.Controls.Common;
using FurnaceUI.Models;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Interactivity;
namespace FurnaceUI.Views.Parameter
{
    public class AUXIndexViewModel : FurnaceUIViewModelBase
    {
        private const string AUX_PATH = "PM1.RecipeEditParameter.AUX";
        private const string TABLE = "Table";
        #region 构造函数
        /// 
        /// 构造函数
        /// 
        public AUXIndexViewModel()
        {
        }
        #endregion
        #region 模型字段
        #region 属性 IsFirstCheck
        public bool IsFirstCheck
        {
            get { return _isFirstCheck; }
            set
            {
                _isFirstCheck = value;
                this.NotifyOfPropertyChange(nameof(IsFirstCheck));
            }
        }
        private bool _isFirstCheck = true;
        #endregion
        #region 属性 IsSelectConfig
        public bool IsSelectConfig
        {
            get { return _isSelectConfig; }
            set
            {
                _isSelectConfig = value;
                this.NotifyOfPropertyChange(nameof(IsSelectConfig));
            }
        }
        private bool _isSelectConfig = true;
        #endregion
        #region 属性 IsSelectStatus
        public bool IsSelectStatus
        {
            get { return _isSelectStatus; }
            set
            {
                _isSelectStatus = value;
                this.NotifyOfPropertyChange(nameof(IsSelectStatus));
            }
        }
        private bool _isSelectStatus = false;
        #endregion
        #region 属性 TableDataSource
        /// 
        /// TableDataSource
        /// 
        public List TableDataSource
        {
            get { return _tableDataSource; }
            set
            {
                _tableDataSource = value;
                this.NotifyOfPropertyChange(nameof(TableDataSource));
            }
        }
        private List _tableDataSource = new List();
        #endregion
        #region 属性 TableDataSource的显示视图
        /// 
        /// TableDataSource的显示视图
        /// 
        public ListCollectionView TableDataViewSource
        {
            get { return _tableDataViewSource; }
            set
            {
                _tableDataViewSource = value;
                NotifyOfPropertyChange("TableDataViewSource");
            }
        }
        private ListCollectionView _tableDataViewSource;
        #endregion
        #region 属性 AUXNode
        private ConfigNode AUXNode { get; set; }
        #endregion
        #region 属性 TableBtnNodes
        /// 
        /// TableBtnNodes
        /// 
        public List TableBtnNodes
        {
            get { return _tableBtnNodes; }
            set
            {
                _tableBtnNodes = value;
                this.NotifyOfPropertyChange(nameof(TableBtnNodes));
            }
        }
        private List _tableBtnNodes = new List();
        #endregion
        #region 属性 LeftTreeNodes
        /// 
        /// LeftTreeNodes
        /// 
        public List LeftTreeNodes
        {
            get { return _leftTreeNodes; }
            set
            {
                _leftTreeNodes = value;
                this.NotifyOfPropertyChange(nameof(LeftTreeNodes));
            }
        }
        private List _leftTreeNodes = new List();
        #endregion
        private int _statusSelectedIndex;
        public int StatusSelectedIndex
        { get=> _statusSelectedIndex;
            set
            {
                _statusSelectedIndex = value;
                NotifyOfPropertyChange(nameof(StatusSelectedIndex));
            } }
        private int _statusIndex;
        #region 订阅属性 StatusTableDataSource
        [Subscription("PM1.CurrentAuxData")]
        public List StatusTableDataSource { get; set; }
        public List ShowStatusTableDataSource { get; set; } = new List();
        #endregion
        #endregion
        #region 方法 配置和状态切换
        /// 
        /// Config/Status 按钮切换
        /// 
        /// 
        public void SwitchListView(object obj)
        {
            if ("status".Equals(obj.ToString()))
            {
                IsSelectStatus = true;
                IsSelectConfig = false;
            }
            if ("setting".Equals(obj.ToString()))
            {
                IsSelectConfig = true;
                IsSelectStatus = false;
            }
            RadioButton radio = new RadioButton();
            radio.Content = "Table1";
            radio.GroupName = obj.ToString();
            TableBtnNodes.FirstOrDefault().IsSelected = true;
            SwitchTable(radio);
        }
        #endregion
        #region 方法 切换Table
        /// 
        /// table切换
        /// 
        /// 
        public void SwitchTable(object obj)
        {
            var rad = obj as RadioButton;
            var tableNameStr = rad.Content.ToString();
            var groupName = rad.GroupName.ToString();
            if (groupName.ToLower().Contains("status"))
            {
                // StatusTableDataSource = AllStatusListDataSource.Where(a => a.TableName.Equals(tableNameStr)).ToList();
            }
            else
            {
                var tabNode = TableBtnNodes.Find(a => a.Name.Equals(tableNameStr));
                TableDataSource = new List(tabNode.SubNodes);
                TableDataViewSource = new ListCollectionView(TableDataSource);
                GetDataOfConfigItems();
            }
        }
        #endregion
        #region 方法 选择配置
        /// 
        /// 选择配置
        /// 
        /// 
        public void SelectionChangedHandle(object obj, object selectedValue)
        {
            if (obj == null || selectedValue == null)
            {
                return;
            }
            ConfigNode node = (ConfigNode)obj;
            if (obj == null)
            {
                return;
            }
            if (selectedValue is ConfigNode selectedItem)
            {
                if (obj != selectedItem)
                {
                    return;
                }
            }
            List colData = new List();
            var windowManager = IoC.Get();
            var colNum = node.Name;
            colData = TableDataSource.Where(a => a.Name.Equals(colNum)).FirstOrDefault().Items;
            AUXEditViewModel editViewModel = new AUXEditViewModel();
            editViewModel.TableNodeItems = colData;
            (windowManager as WindowManager)?.ShowDialogWithTitle(editViewModel, null, "Edit AUX");
            GetDataOfConfigItems();
        }
        #endregion
        #region 私有方法 数据初始化
        /// 
        /// 数据初始化
        /// 
        private void InitData()
        {
            ConfigNode rootNode = SystemConfigProvider.Instance.GetConfig(true);
            AUXNode = FindNodeByName(rootNode, AUX_PATH);
            foreach (var item in AUXNode.SubNodes)
            {
                if (!item.Name.Contains(TABLE))
                {
                    continue;
                }
                foreach (var tableItem in item.SubNodes)
                {
                    var commonNode = AUXNode.SubNodes.Find(a => a.Name.Equals(tableItem.Name)).Items;
                    List node = new List();
                    node.AddRange(commonNode);
                    node.AddRange(tableItem.Items);
                    tableItem.Items = node;
                }
            }
            //按钮初始化
            TableBtnNodes = AUXNode.SubNodes.Where(a => a.Name.Contains(TABLE)).ToList();
            TableBtnNodes.FirstOrDefault().IsSelected = true;
            //表格数据初始化
            TableDataSource = new List(TableBtnNodes.FirstOrDefault().SubNodes);
            TableDataViewSource = new ListCollectionView(TableDataSource);
            GetDataOfConfigItems();
        }
        #endregion
        #region 私有方法 获取配置数据
        /// 
        /// 获取配置数据
        /// 
        private void GetDataOfConfigItems()
        {
            if (TableDataSource == null)
            {
                return;
            }
            new Task(() =>
            {
                Dictionary keyValuePairs = new Dictionary();
                List getConfigs = new List();
                foreach (var item in TableDataSource)
                {
                    foreach (var tableItem in item.Items)
                    {
                        var key = $"{tableItem.Path}.{tableItem.Name}";
                        getConfigs.Add(key);
                        keyValuePairs.Add(key, tableItem);
                    }
                }
                var configs = QueryDataClient.Instance.Service.PollConfig(getConfigs);
                foreach (var key in configs.Keys)
                {
                    keyValuePairs[key].CurrentValue = configs[key].ToString();
                }
            }).Start();
        }
        #endregion
        #region 私有方法 根据名称获取节点
        /// 
        /// 根据名称获取节点
        /// 
        /// 
        /// 
        /// 
        private ConfigNode FindNodeByName(ConfigNode parentNode, string strName)
        {
            string strCates = strName.Split('.')[0];
            ConfigNode node = parentNode.SubNodes.Find((x) => x.Name == strCates);
            if (node == null)
                return parentNode;
            else
                return FindNodeByName(node, strName.Replace(strCates + ".", ""));
        }
        #endregion
        #region 重写方法 初始化
        /// 
        /// 初始化
        /// 
        protected override void OnInitialize()
        {
            base.OnInitialize();
            InitData();
        }
        #endregion
        #region 方法 切换到第一行
        /// 
        /// 切换到第一行
        /// 
        RelayCommand _moveCurrentToFirstCommand;
        public ICommand MoveCurrentToFirstCommand
        {
            get
            {
                if (_moveCurrentToFirstCommand == null)
                {
                    _moveCurrentToFirstCommand = new RelayCommand(param => this.MoveCurrentToFirst(), param => this.CanMoveCurrentToFirst());
                }
                return _moveCurrentToFirstCommand;
            }
        }
        private bool CanMoveCurrentToFirst()
        {
            return TableDataViewSource?.CurrentPosition > 0;
        }
        private void MoveCurrentToFirst()
        {
            if (TableDataViewSource?.CurrentPosition > 0)
            {
                TableDataViewSource?.MoveCurrentToFirst();
            }
        }
        #endregion
        #region 方法 切换到上一行
        /// 
        /// 切换到上一行
        /// 
        RelayCommand _moveCurrentToPreviousCommand;
        public ICommand MoveCurrentToPrevioustCommand
        {
            get
            {
                if (_moveCurrentToPreviousCommand == null)
                {
                    _moveCurrentToPreviousCommand = new RelayCommand(param => this.MoveCurrentToPrevious(), param => this.CanMoveCurrentToPrevious());
                }
                return _moveCurrentToPreviousCommand;
            }
        }
        private bool CanMoveCurrentToPrevious()
        {
            return TableDataViewSource?.CurrentPosition > 0;
        }
        private void MoveCurrentToPrevious()
        {
            if (TableDataViewSource?.CurrentPosition > 0)
            {
                TableDataViewSource?.MoveCurrentToPrevious();
            }
        }
        #endregion
        #region 方法 切换到下一行
        /// 
        /// 切换到下一行
        /// 
        RelayCommand _moveCurrentToNextCommand;
        public ICommand MoveCurrentToNextCommand
        {
            get
            {
                if (_moveCurrentToNextCommand == null)
                {
                    _moveCurrentToNextCommand = new RelayCommand(param => this.MoveCurrentToNext(), param => this.CanMoveCurrentToNext());
                }
                return _moveCurrentToNextCommand;
            }
        }
        private bool CanMoveCurrentToNext()
        {
            bool isEnable = false;
            if (TableDataViewSource != null)
            {
                isEnable = TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1;
            }
            return isEnable;
        }
        private void MoveCurrentToNext()
        {
            if (TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1)
            {
                TableDataViewSource?.MoveCurrentToNext();
            }
        }
        #endregion
        #region 方法 切换到最后一行
        /// 
        /// 切换到最后一行
        /// 
        RelayCommand _moveCurrentToLastCommand;
        public ICommand MoveCurrentToLastCommand
        {
            get
            {
                if (_moveCurrentToLastCommand == null)
                {
                    _moveCurrentToLastCommand = new RelayCommand(param => this.MoveCurrentToLast(), param => this.CanMoveCurrentToLast());
                }
                return _moveCurrentToLastCommand;
            }
        }
        private bool CanMoveCurrentToLast()
        {
            bool isEnable = false;
            if (TableDataViewSource != null)
            {
                isEnable = TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1;
            }
            return isEnable;
        }
        public void MoveCurrentToLast()
        {
            if (TableDataViewSource?.CurrentPosition < TableDataViewSource?.Count - 1)
            {
                TableDataViewSource?.MoveCurrentToLast();
            }
        }
        #endregion
        protected override void InvokeAfterUpdateProperty(Dictionary data)
        {
            base.InvokeAfterUpdateProperty(data);
            if (ShowStatusTableDataSource == null || ShowStatusTableDataSource.Count == 0)
            {
                StatusTableDataSource.ToList().ForEach(x => ShowStatusTableDataSource.Add(x));
            }
            else
            {
                StatusTableDataSource.ToList().ForEach(x =>
                {
                    var showStatus = ShowStatusTableDataSource.FirstOrDefault(s => s.Index == x.Index);
                    showStatus.Feedback = x.Feedback;
                    showStatus.SetPoint = x.SetPoint;
                    showStatus.WarningLowLimit = x.WarningLowLimit;
                    showStatus.WarningHighLimit = x.WarningHighLimit;
                    showStatus.AlarmHighLimit = x.AlarmHighLimit;
                    showStatus.AlarmLowLimit = x.AlarmLowLimit;
                    showStatus.InvokePropertyChanged();
                });
            }
        }
        protected override void InvokeBeforeUpdateProperty(Dictionary data)
        {
            base.InvokeBeforeUpdateProperty(data);
        }
    }
    public class AutoScrollBehavior : Behavior
    {
        protected override void OnAttached()
        {
            AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
            base.OnAttached();
        }
        protected override void OnDetaching()
        {
            AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
            base.OnDetaching();
        }
        private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender is ListView listView)
            {
                if (listView.SelectedItem != null)
                {
                    listView.Dispatcher.BeginInvoke((System.Action)delegate
                    {
                        listView.UpdateLayout();
                        listView.ScrollIntoView(listView.SelectedItem);//在这里使用一的方法
                    });
                }
            }
        }
    }
}