using NEIntelligentControl2.Models.Alarm;
using NEIntelligentControl2.Service.Alarm;
using NEIntelligentControl2.Windows.Alarm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
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.Navigation;
using System.Windows.Shapes;

namespace NEIntelligentControl2.Views.Alarm
{
    /// <summary>
    /// 实时故障视图
    /// </summary>
    public partial class RealTimeFalutInfoView : UserControl
    {
        // ------------依赖属性--------------
        public static DependencyProperty IsFixedProperty = DependencyProperty.Register("IsFixed", typeof(bool), typeof(RealTimeFalutInfoView));
        public static DependencyProperty IsFaultProperty = DependencyProperty.Register("IsFault", typeof(bool), typeof(RealTimeFalutInfoView));
        public static DependencyProperty IsOpenedProperty = DependencyProperty.Register("IsOpened", typeof(bool), typeof(RealTimeFalutInfoView));
        /// <summary>
        /// 是否固定
        /// </summary>
        public bool IsFixed { get => (bool)GetValue(IsFixedProperty); set => SetValue(IsFixedProperty, value); }
        /// <summary>
        /// 是否是故障
        /// </summary>
        public bool IsFault { get => (bool)GetValue(IsFaultProperty); set => SetValue(IsFaultProperty, value); }
        /// <summary>
        /// 是否打开
        /// </summary>
        public bool IsOpened { get => (bool)GetValue(IsOpenedProperty); set => SetValue(IsOpenedProperty, value); }

        private ObservableCollection<FaultInfoModel> _FaultList;
        private HashSet<long> _FaultIds;
        private ObservableCollection<AlarmInfo> _AlarmList;
        private HashSet<long> _AlarmIds;

        private AlarmManager _AlarmManager;
        public RealTimeFalutInfoView()
        {
            InitializeComponent();
            IsFault = true;
            _FaultList = new ObservableCollection<FaultInfoModel>();
            _GDFault.ItemsSource = _FaultList;
            _AlarmList = new ObservableCollection<AlarmInfo>();
            _GDAlarm.ItemsSource = _AlarmList;
            _AlarmIds = new HashSet<long>();
            _FaultIds = new HashSet<long>();
            _AlarmManager = App.ServiceProvider.GetService(typeof(AlarmManager)) as AlarmManager;
            _AlarmManager.OnFaultCount += OnFaultCount;
            _AlarmManager.OnAlarmCount += OnAlarmCount;
        }

        private void OnAlarmCount(List<AlarmInfo> obj)
        {
            var ls = obj.Select(f => f.Id).ToList();
            var removed = _AlarmList.Where(f => !ls.Contains(f.Id)).ToList();
            Dispatcher.Invoke(() =>
            {
                for (int i = obj.Count - 1; i >= 0; i--)
                {
                    var v = obj[i];
                    if (_AlarmIds.Contains(v.Id)) continue;
                    _AlarmList.Insert(0, v);
                    _AlarmIds.Add(v.Id);
                }
                foreach (var v in removed)
                {
                    _AlarmList.Remove(v);
                    _AlarmIds.Remove(v.Id);
                }
            });
        }

        private void OnFaultCount(List<FaultInfoModel> obj)
        {
            var ls = obj.Select(f => f.FaultInfo.Id).ToList();
            var removed = _FaultList.Where(f => !ls.Contains(f.FaultInfo.Id)).ToList();
            Dispatcher.Invoke(() =>
                {
                    for (int i = obj.Count - 1; i >= 0; i--)
                    {
                        var v = obj[i];
                        if (_FaultIds.Contains(v.FaultInfo.Id)) continue;
                        _FaultList.Insert(0, v);
                        _FaultIds.Add(v.FaultInfo.Id);
                    }
                    foreach (var v in removed)
                    {
                        _FaultList.Remove(v);
                        _FaultIds.Remove(v.FaultInfo.Id);
                    }
                });
        }

        private void cc_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            IsFixed = !IsFixed;
        }

        private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            var v = ((FrameworkElement)sender).DataContext as FaultInfoModel;
            if (v == null || v.FaultInfo == null) return;
            Windows.Alarm.DeviceDetailAlarmWindow.Show(v.FaultInfo);
            IsOpened = false;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            switch (((Control)sender).Tag)
            {
                case "fault": // 报警故障切换
                    IsFault = !IsFault;
                    break;
                case "rtalarm":// 实时报警
                    RealTimeAlarm();
                    break;
                case "hisalarm": // 历史报警
                    HistoryAlarm();
                    break;
                case "hisfault": // 历史故障
                    HistoryFault();
                    break;
                default:return;
            }
        }

        /// <summary>
        /// 历史故障
        /// </summary>
        private void HistoryFault()
        {
            HistoryFaultWindow.ShowWindow();
        }

        /// <summary>
        /// 历史报警
        /// </summary>
        private void HistoryAlarm()
        {
            HistoryAlarmWindow.ShowWindow();
        }

        /// <summary>
        /// 实时报警
        /// </summary>
        private void RealTimeAlarm()
        {
            RealTimeAlarmWindow.ShowWindow();
        }
    }
}