using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Aitex.Core.RT.SCCore;
using ControlzEx.Standard;
using FabConnect.SecsGemInterface.Application.Objects.ObjectService;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.Schedulers;
using Prism.Commands;
using Prism.Mvvm;
using Venus_MainPages.Unity;
using Venus_MainPages.Views;
//using  Venus_MainPages.Unity.SystemConfig;

namespace Venus_MainPages.ViewModels
{
    public class SystemConfigViewModel : BindableBase
    {
        #region 私有字段
        private List<ConfigNode> _ConfigNodes = new List<ConfigNode>();
        private List<ConfigItem> _configItems = null;
        private List<String> _SearchResultCollection = null;
        string _CurrentNodeName = string.Empty;
        private Visibility _Visibility = new Visibility();
        private string[] _InstalledModules = null;
        private string _SearchText;
        List<string> searchResultListHistory = new List<string>();

        public string SearchText
        {
            get { return _SearchText; }
            set { _SearchText = value; RaisePropertyChanged("SearchText"); }
        }
        #endregion

        #region 属性
        public List<ConfigNode> ConfigNodes
        {
            get { return _ConfigNodes; }
            set { _ConfigNodes = value; RaisePropertyChanged("ConfigNodes"); }
        }
        public List<String> SearchResultCollection
        {
            get { return _SearchResultCollection; }
            set { _SearchResultCollection = value; RaisePropertyChanged("SearchResultCollection"); }
        }
        public List<ConfigItem> ConfigItems
        {
            get { return _configItems; }
            set { _configItems = value; RaisePropertyChanged("ConfigItems"); }
        }
        public Visibility SearchListBoxShow
        {
            get { return _Visibility; }
            set { _Visibility = value; RaisePropertyChanged("SearchListBoxShow"); }
        }

        #region 命令

        private DelegateCommand<object> _TreeViewSelectedItemChangedCmd;
        public DelegateCommand<object> TreeViewSelectedItemChangedCmd =>
            _TreeViewSelectedItemChangedCmd ?? (_TreeViewSelectedItemChangedCmd = new DelegateCommand<object>(TreeViewSelectedItemChanged));
        #endregion



        #endregion

        #region 命令
        private DelegateCommand<object> _SetValueCommand;
        public DelegateCommand<object> SetValueCommand =>
            _SetValueCommand ?? (_SetValueCommand = new DelegateCommand<object>(SetValue));
        private DelegateCommand<object> _SearchTextChangedCommand;
        public DelegateCommand<object> SearchTextChangedCommand =>
            _SearchTextChangedCommand ?? (_SearchTextChangedCommand = new DelegateCommand<object>(SearchTextChanged));

        private DelegateCommand<object> _ListBoxSelectSearchResultCommand;
        public DelegateCommand<object> ListBoxSelectSearchResultCommand =>
            _ListBoxSelectSearchResultCommand ?? (_ListBoxSelectSearchResultCommand = new DelegateCommand<object>(SelectSearchResult));




        #endregion
        public SystemConfigViewModel()
        {
            SearchListBoxShow = Visibility.Hidden;
            ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;

        }

        //protected override void OnInitialize()
        //{
        //    base.OnInitialize();

        //    ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
        //}

        //输入关键字
        private void SearchTextChanged(object searchConfigItem)
        {
            List<string> searchResultList = new List<string>();
            //如果输入框为空,不显示提示词,并展开左侧栏
            if (string.IsNullOrEmpty((string)searchConfigItem) || searchConfigItem.ToString().Length<3)
            {
                ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
                SearchListBoxShow = Visibility.Hidden;
            }
            else
            {
                ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
                var itemslist = ConfigNodes.SelectMany(m => m.Items).ToList();
                if (SearchText != null)
                {
                    SearchListBoxShow = Visibility.Visible;
                    //根节点
                    string searchResult = null;
                    _InstalledModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(',');
                    foreach (var ConfigNodesItems in ConfigNodes)
                    {
                        if (!_InstalledModules.Contains(ConfigNodesItems.Name) && ConfigNodesItems.Name != "System" && ConfigNodesItems.Name != "Recipe" && ConfigNodesItems.Name != "Scheduler")
                        {
                            ConfigNodesItems.IsShow = false;
                            continue;
                        }
                        //根节点搜索
                        if (ConfigNodesItems.Name.Contains(SearchText))
                        {
                            ConfigNodesItems.IsShow = true;//展开根节点
                            _CurrentNodeName = SearchText;//TreeView节点
                            searchResult = _CurrentNodeName;
                            GetDataOfConfigItems();
                        }
                        else
                        {
                            ConfigNodesItems.IsShow = false;
                            //二级节点搜索
                            foreach (var SubNodesItems in ConfigNodesItems.SubNodes)
                            {
                                if (SubNodesItems.Name.ToLower().Contains(SearchText.ToLower()))
                                {
                                    ConfigNodesItems.IsShow = true;
                                    SubNodesItems.IsShow = true;
                                    _CurrentNodeName = String.Format("{0}{1}{2}", ConfigNodesItems.Name, ".", SubNodesItems.Name);
                                    searchResult = _CurrentNodeName;
                                    GetDataOfConfigItems();
                                }
                                else
                                {
                                    SubNodesItems.IsShow = false;

                                    //叶子节点搜索
                                    foreach (var Items in SubNodesItems.Items)
                                    {
                                        var searchResult1 = SubNodesItems.Items.FindAll(e => e.Name.ToLower().Contains(SearchText.ToLower()));
                                        if (Items.Name.ToLower().Contains(SearchText.ToLower()))
                                        {
                                            ConfigNodesItems.IsShow = true;
                                            SubNodesItems.IsShow = true;
                                            _CurrentNodeName = String.Format("{0}{1}{2}{3}{4}", ConfigNodesItems.Name, ".", SubNodesItems.Name, ".", Items.Name);
                                            searchResult = _CurrentNodeName;
                                            GetDataOfConfigItems();
                                            searchResultList.Add(_CurrentNodeName);
                                        }
                                    }
                                }
                            }
                        }
                        var searchResult2 = ConfigNodesItems.Items.FindAll(e => e.Name.ToLower().Contains(SearchText.ToLower()));
                        if (searchResult2.Count != 0)
                        {
                            ConfigNodesItems.IsShow = true;
                            _CurrentNodeName = SearchText;//TreeView节点
                            searchResultList.Add(ConfigNodesItems.Name + "." + searchResult2[0].Name);
                            searchResult = _CurrentNodeName;
                            GetDataOfConfigItems();
                        }
                        //查询为空
                        if (searchResult == null)
                        {
                            ConfigItems = null;
                        }

                    }
                }
                SearchResultCollection = searchResultList;
                if (searchResultList.Count > 0)
                {
                    searchResultListHistory = searchResultList;

                }
            }
        }
        //选择选中项
        private void SelectSearchResult(object slectItem)
        {
            SearchResultCollection = searchResultListHistory;
            ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
            if (slectItem != null)
            {
                SearchText = slectItem.ToString();
                string[] searchResult = SearchText.Split('.');
                List<ConfigItem> ConfigItem = new List<ConfigItem>();
                //根节点下ConfigItems
                if (searchResult.Length == 2)
                {
                    ConfigNodes.ForEach(e => e.IsShow = false);
                    ConfigNode targetmodule = ConfigNodes.Find(e => e.Name.ToLower() == searchResult[0].ToLower());
                    targetmodule.IsShow = true;
                    targetmodule.SubNodes.ForEach(e => e.IsShow = false);
                    _CurrentNodeName = string.IsNullOrEmpty(targetmodule.Path) ? targetmodule.Name : $"{targetmodule.Path}.{targetmodule.Name}";
                    ConfigItems = targetmodule.Items.FindAll(e => e.Name.ToLower() == searchResult[1].ToLower());
                    GetDataOfConfigItems();

                }
                //二级节点下ConfigItems
                if (searchResult.Length == 3)
                {
                    ConfigNodes.ForEach(e => e.IsShow = false);
                    ConfigNode targetmodule = ConfigNodes.Find(e => e.Name.ToLower() == searchResult[0].ToLower());
                    targetmodule.IsShow = true;
                    targetmodule.SubNodes.ForEach(e => e.IsShow = false);
                    ConfigNode submodule = targetmodule.SubNodes.Find(e => e.Name.ToLower() == searchResult[1].ToLower());
                    submodule.IsShow = true;
                    _CurrentNodeName = string.IsNullOrEmpty(submodule.Path) ? submodule.Name : $"{submodule.Path}.{submodule.Name}";
                    ConfigItems = submodule.Items.FindAll(e => e.Name.ToLower() == searchResult[2].ToLower());
                    submodule.Items.FindAll(e => e.Name.ToLower() != searchResult[2].ToLower()).ForEach(e => e.Visible = false);
                    GetDataOfConfigItems();
                }

            }

        }
        private void TreeViewSelectedItemChanged(object node)
        {
            var node2 = (ConfigNode)node;
            _CurrentNodeName = string.IsNullOrEmpty(node2.Path) ? node2.Name : $"{node2.Path}.{node2.Name}";
            string[] searchResult = null;
            if (SearchText == "" || SearchText == null)
            {
                ConfigItems = node2.Items;
            }
            else
            {
                searchResult = SearchText.Split('.');
                if (searchResult.Length == 2)
                {
                    ConfigItems = node2.Items.FindAll(e => e.Name.ToLower() == searchResult[1].ToLower());
                }
                if (searchResult.Length == 3)
                {
                    ConfigItems = node2.Items.FindAll(e => e.Name.ToLower() == searchResult[2].ToLower());
                }
            }
            GetDataOfConfigItems();
        }

        private void GetDataOfConfigItems()
        {
            if (ConfigItems == null)
                return;

            for (int i = 0; i < ConfigItems.Count; i++)
            {
                string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", ConfigItems[i].Name);
                ConfigItems[i].CurrentValue = SystemConfigProvider.Instance.GetValueByName(key);

                if (ConfigItems[i].Type == DataType.Bool)
                {
                    bool value;
                    if (bool.TryParse(ConfigItems[i].CurrentValue, out value))
                        ConfigItems[i].BoolValue = value;
                }
                else
                    ConfigItems[i].StringValue = ConfigItems[i].CurrentValue;
            }
        }

        private void SetValue(Object myitem)
        {
            //key :System.IsSimulatorMode 
            //value: true or false 都是字符串

            //input check
            var item = (ConfigItem)myitem;
            string value;
            if (item.Type == DataType.Bool)
            {
                value = item.BoolValue.ToString().ToLower();
            }
            else
            {
                if (item.TextSaved)
                    return;

                if (item.Type == DataType.Int)
                {
                    int iValue;
                    if (int.TryParse(item.StringValue, out iValue))
                    {
                        if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
                        {
                            if (iValue > item.Max || iValue < item.Min)
                            {
                                //DialogBox.ShowWarning(string.Format("The value should be between {0}  and {1}.", ((int)item.Min).ToString(), ((int)item.Max).ToString()));
                                return;
                            }
                        }
                    }
                    else
                    {
                        //DialogBox.ShowWarning("Please input valid data.");
                        return;
                    }
                    value = item.StringValue;
                }
                else if (item.Type == DataType.Double)
                {
                    double fValue;
                    if (double.TryParse(item.StringValue, out fValue))
                    {
                        if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
                        {
                            if (fValue > item.Max || fValue < item.Min)
                            {
                                //DialogBox.ShowWarning(string.Format("The value should be between {0}  and {1}.", item.Min.ToString(), item.Max.ToString()));
                                return;
                            }
                        }
                    }
                    else
                    {
                        //DialogBox.ShowWarning("Please input valid data.");
                        return;
                    }
                    value = item.StringValue;
                }
                else
                    value = item.StringValue;
            }

            string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", item.Name);
            InvokeClient.Instance.Service.DoOperation("System.SetConfig", key, value);

            item.TextSaved = true;

            Reload();
        }

        public void Reload()
        {
            GetDataOfConfigItems();
        }

        public void SaveAll()
        {
            if (ConfigItems == null)
                return;

            ConfigItems.ForEach(item => SetValue(item));
        }

    }
}