using FLY.Modbus;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace FLY.Winder.UI.Server
{
    /// <summary>
    /// DRList.xaml 的交互逻辑
    /// </summary>
    public partial class WdDRList : Window, INotifyPropertyChanged
    {
        ObservableCollection<DataToRegsView> dataToRegsViews = new ObservableCollection<DataToRegsView>();
        Modbus.WithThread.ModbusMapper_Client plc;

        public event PropertyChangedEventHandler PropertyChanged;

        public WdDRList()
        {
            InitializeComponent();

        }
        public void Init(Modbus.WithThread.ModbusMapper_Client plc)
        {

            this.plc = plc;


            for (int i = 0; i < plc.DRmap.Count(); i++)
            {
                var dr = plc.DRmap[i];

                //获取描述
                var type = dr.owner.GetType();
                var propertyInfo = type.GetProperty(dr.propertyName);
                var attributes = propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
                string description = "";
                if (attributes.Length > 0)
                {
                    description = (attributes.First() as DescriptionAttribute).Description;
                }


                dataToRegsViews.Add(new DataToRegsView()
                {
                    dr = dr,
                    Addr = dr.addr,
                    RegAddr = dr.regAddr,
                    DataArea = dr.dataArea,
                    OwnerName = dr.ownerName,
                    IsNeedUpdate = dr.isNeedUpdate,
                    PropertyName = dr.propertyName,
                    Description = description,
                    Value = dr.value
                });
            }
            plc.PropertyChanged += Plc_PropertyChanged;
            plc.NameDataChanged += Plc_NameDataChanged;

            dataGrid.ItemsSource = dataToRegsViews;

            this.DataContext = this;
        }

        private void Plc_NameDataChanged(object sender, DataToRegs dr)
        {
            var drViews = from _drView in dataToRegsViews
                          where _drView.dr == dr
                          select _drView;

            if (drViews.Count() == 0)
                return;

            var drView = drViews.First();
            drView.Value = dr.value;
        }

        private void Plc_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == nameof(plc.PlanUpdateTime))
            {
                for (int i = 0; i < plc.DRmap.Count(); i++)
                {
                    var dr = plc.DRmap[i];
                    dataToRegsViews[i].IsNeedUpdate = dr.isNeedUpdate;
                }
            }
        }

        public int SearchIndex { get; private set; } = -1;
        public string SearchText { get; set; }

        private void btnSearchDownClick(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(SearchText))
            {
                MessageBox.Show("输入为空", "异常", MessageBoxButton.OK, MessageBoxImage.Hand);
                return;
            }
            int newSearchIndex = -1;
            for (int i = SearchIndex + 1; i < dataToRegsViews.Count(); i++)
            {

                if (dataToRegsViews[i].OwnerName.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
                if (dataToRegsViews[i].PropertyName.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
                if (dataToRegsViews[i].Description.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
                if (dataToRegsViews[i].RegAddr.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
            }

            if (newSearchIndex != -1)
            {
                SearchIndex = newSearchIndex;
                dataGrid.SelectedItem = dataToRegsViews[newSearchIndex];
                dataGrid.ScrollIntoView(dataGrid.SelectedItem);
                return;
            }
            else
            {
                SearchIndex = -1;
                MessageBox.Show("不能找到更多", "异常", MessageBoxButton.OK, MessageBoxImage.Hand);
                return;
            }

        }

        private void btnSearchUpClick(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(SearchText))
            {
                MessageBox.Show("输入为空", "异常", MessageBoxButton.OK, MessageBoxImage.Hand);
                return;
            }
            int newSearchIndex = -1;
            for (int i = SearchIndex - 1; i >= 0 && i < dataToRegsViews.Count(); i--)
            {

                if (dataToRegsViews[i].OwnerName.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
                if (dataToRegsViews[i].PropertyName.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
                if (dataToRegsViews[i].Description.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
                if (dataToRegsViews[i].RegAddr.Contains(SearchText))
                {
                    //找到了
                    newSearchIndex = i;
                    break;
                }
            }

            if (newSearchIndex != -1)
            {
                SearchIndex = newSearchIndex;
                dataGrid.SelectedItem = dataToRegsViews[newSearchIndex];
                return;
            }
            else
            {
                SearchIndex = -1;
                MessageBox.Show("不能找到更多", "异常", MessageBoxButton.OK, MessageBoxImage.Hand);
                return;
            }
        }
    }

    /// <summary>
    /// 数据映射的类;
    /// Data: PC 属性 
    /// Regs: PLC 对象(寄存器、线圈)
    /// </summary>
    public class DataToRegsView : INotifyPropertyChanged
    {
        public DataToRegs dr;
        /// <summary>
        /// 对应 PLC寄存器区 coil or register
        /// </summary>
        public PLCAddressArea DataArea { get; set; }

        /// <summary>
        /// PLC寄存器 首地址
        /// </summary>
        public int Addr { get; set; }

        /// <summary>
        /// 寄存器 原始地址字符串
        /// </summary>
        public string RegAddr { get; set; }

        public string OwnerName { get; set; }
        /// <summary>
        /// object 的 property 名称, 只能是 数字类型都是double, 剩下就是 bool
        /// </summary>
        public string PropertyName { get; set; }

        /// <summary>
        /// property 描述
        /// </summary>
        public string Description { get; set; }
        /// <summary>
        /// property 的值, 没有缩小. 只有 double 与 bool 
        /// </summary>
        public object Value { get; set; }

        /// <summary>
        /// 需要从PLC读取数据更新
        /// </summary>
        public bool IsNeedUpdate { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;


        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return PropertyName + " [" + ((int)DataArea).ToString() + "](" + Addr + ")";
        }
    }
}