using FLY.OBJComponents.Client;
using FLY.Thick.Base.Common;
using FLY.UI.Module;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
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.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using ThickTcpUiInWindow;

namespace FLY.Thick.BlowingScan.UI.Client.UIModule
{
    /// <summary>
    /// DynAreaIO.xaml 的交互逻辑
    /// </summary>
    public partial class DynAreaIO : UserControl
    {
        DynAreaIOViewModel viewModel;
        TDGage gage;
        public DynAreaIO()
        {
            InitializeComponent();
        }


        public void Init(int id)
        {
            //获取设备
            gage = Application.Current.Properties["ThickGage"] as TDGage;
            viewModel = new DynAreaIOViewModel();
            viewModel.Init(gage.mDynArea, gage.mWarningReasonWindow);
            this.DataContext = viewModel;
        }
        protected virtual void Border_IO_Click(object sender, RoutedEventArgs e)
        {

            PgErrorTable p = new PgErrorTable();
            p.Init(gage.mWarningService,
                gage.mWarningReasonWindow,
                gage.mFlyAdServiceClient,
                typeof(WdIOTip));

            (Application.Current.Properties["NavigationService"] as NavigationService).Navigate(p);

        }
    }

    public class DynAreaIOViewModel : INotifyPropertyChanged
    {
        #region 延时推送 MARKNO
        const int MARKNO_UPDATEERROR = 1;
        #endregion

        public event PropertyChangedEventHandler PropertyChanged;

        public UInt16 IStatus { get; set; } = 0xffff;
        public UInt16 OStatus { get; set; } = 0x000f;

        public int Hrs { get; set; } = 3;

        /// <summary>
        /// 是永久使用
        /// </summary>
        public bool IsForever { get; set; } = false;
        public bool IsError { get; set; }
        /// <summary>
        /// 异常消息
        /// </summary>
        public string ErrMsg { get; set; }

        DynArea mDynArea;
        BufferWindow<OBJComponents.Common.FlyData_WarningHistory> mWindow;
        DispatcherTimer timer_error;
        private int reason_list_index = -1;
        public void Init(DynArea dynArea, OBJComponents.Client.BufferWindow<OBJComponents.Common.FlyData_WarningHistory> mWarningReasonWindow)
        {
            //创建窗口观察 报警原因列表
            mWindow = mWarningReasonWindow;
            mDynArea = dynArea;
            Misc.BindingOperations.SetBinding(mDynArea, "IStatus", this, "IStatus");
            Misc.BindingOperations.SetBinding(mDynArea, "OStatus", this, "OStatus");
            Misc.BindingOperations.SetBinding(mDynArea, "Hrs", this, "Hrs");
            UpdateIsForever();


            //报警原因轮流显示
            timer_error = new DispatcherTimer();
            timer_error.Interval = TimeSpan.FromSeconds(3);
            timer_error.Tick += (s, e) =>
            {
                reason_list_index--;
                if (reason_list_index < 0)
                    reason_list_index = mWindow.Record.Count();
                UpdateError();
            };
            mWindow.Record.CollectionChanged += Record_CollectionChanged;

            mDynArea.PropertyChanged += (s, e) =>
            {
                if (e.PropertyName == "ServerIsConnected")
                {
                    UpdateError();
                }
                else if (e.PropertyName == "Hrs")
                {
                    UpdateIsForever();
                }
            };

            UpdateError();
        }
        void UpdateIsForever()
        {
            if (mDynArea.Hrs > 50000)
                IsForever = true;
            else
                IsForever = false;
        }
        private void Record_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            FObjBase.PollModule.Current.Poll_JustOnce(
                new FObjBase.PollModule.PollHandler(delegate ()
                {
                    reason_list_index = mWindow.Record.Count() - 1;

                    UpdateError();
                }), this, MARKNO_UPDATEERROR);
        }

        void UpdateError()
        {
            if (!mDynArea.ServerIsConnected)
            {
                ErrMsg = "服务器连接断开";
                IsError = true;
                reason_list_index = -1;
                timer_error.Stop();
            }
            else if (mWindow.Record.Count > 0)
            {
                if (reason_list_index >= mWindow.Record.Count)
                    reason_list_index = mWindow.Record.Count - 1;
                else if (reason_list_index < 0)
                    reason_list_index = 0;


                ErrMsg = mWindow.Record[reason_list_index].Description;
                IsError = true;
                timer_error.Start();
            }
            else
            {
                IsError = false;
                ErrMsg = "";
                reason_list_index = -1;
                timer_error.Stop();
            }
        }

    }
    public class DynAreaIOViewModel_UnitTest : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public UInt16 IStatus { get; set; } = 0xff7f;
        public UInt16 OStatus { get; set; } = 0x0005;

        public int Hrs { get; set; } = 2000;

        /// <summary>
        /// 是永久使用
        /// </summary>
        public bool IsForever { get; set; } = false;
        public bool IsError { get; set; }
        /// <summary>
        /// 异常消息
        /// </summary>
        public string ErrMsg { get; set; }
    }
    public class UIModule_DynAreaIO : IUIModule
    {
        /// <summary>
        /// 控件标题
        /// 它的值取决于culture
        /// </summary>
        public string Title
        {
            get
            {
                return Application.Current.FindResource("strDynAreaIO") as string;
            }
        }

        /// <summary>
        /// 控件
        /// 创建时,需要给它唯一ID,让加载自己的数据
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public FrameworkElement GetComponent(int id)
        {
            DynAreaIO graph = new DynAreaIO();
            graph.Init(id);
            return graph;
        }

        /// <summary>
        /// 控件缩略图,用于编辑界面时,大致看看
        /// 创建时,需要给它唯一ID,让加载自己的数据
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public FrameworkElement GetThumbnail(int id)
        {
            return new System.Windows.Controls.Grid();
        }


        /// <summary>
        /// 给出全部控件ID, 控件自行删除没有的参数
        /// </summary>
        /// <param name="IDs"></param>
        public void MatchParam(int[] IDs)
        {

        }
    }



}