using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Toolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Windows;
using System.Threading;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using BPASmartClient.Device;
using BPASmartClient.Helper;
using BPASmartClient.Business;
using BPASmartClient.Model;

namespace BPASmartClient.ViewModel
{
    public class AlarmViewModel : ObservableObject
    {
        public AlarmViewModel()
        {
            ControlCommand = new RelayCommand(() =>
            {
                if (ControlButText == "报警复位")
                {
                    return;
                }
                if (ControlButText == "开始查询")
                {
                    var lists = Sqlite<Alarm>.GetInstance.GetData();
                    var res = lists.Where(p => Convert.ToDateTime(p.Date) >= StartDateTime && Convert.ToDateTime(p.Date) <= EndDateTime).ToList();
                    if (res != null)
                    {
                        HistoryAlarm.Clear();
                        foreach (var item in res)
                        {
                            HistoryAlarm.Add(item);
                        }
                    }
                }

            });

            SwitchCommand = new RelayCommand(() =>
            {
                if (ButContent == "历史报警")
                {
                    GetHistoryAlarm();
                    CurrentDataVis = Visibility.Hidden;
                    HistoryDataVis = Visibility.Visible;
                    IsVisibility = Visibility.Visible;
                    ControlButText = "开始查询";
                    ButContent = "实时报警";
                    return;
                }

                if (ButContent == "实时报警")
                {
                    HistoryDataVis = Visibility.Hidden;
                    CurrentDataVis = Visibility.Visible;
                    IsVisibility = Visibility.Hidden;
                    ControlButText = "报警复位";
                    ButContent = "历史报警";
                    return;
                }
            });
            AlarmMonitoring();
        }


        public void AlarmMonitoring()
        {
            AlarmInfos.Clear();
            Plugin.GetInstance()?.GetPlugin<DeviceMgr>()?.GetDevices()?.ForEach(device =>
            {
                device.alarmHelper.Alarms.ForEach((item) => { AlarmInfos.Add(item); });
                device.alarmHelper.AddAction += new Action<string>((s) =>
                {
                    var res = device.alarmHelper.Alarms.FirstOrDefault(p => p.Info == s);
                    if (res != null) Application.Current.Dispatcher.Invoke(new Action(() => { AlarmInfos.Insert(0, res); }));
                });

                device.alarmHelper.RemoveAction += new Action<string>((s) =>
                {
                    var res = AlarmInfos.FirstOrDefault(p => p.Info == s);
                    if (res != null) Application.Current.Dispatcher.Invoke(new Action(() => { AlarmInfos.Remove(res); }));
                });
            });
        }

        private void GetHistoryAlarm()
        {
            var data = Sqlite<Alarm>.GetInstance.GetData();
            if (data != null)
            {
                HistoryAlarm.Clear();
                foreach (var item in data)
                {
                    int day = DateTime.Now.Subtract(Convert.ToDateTime(item.Date)).Days;
                    if (day == 0)
                    {
                        HistoryAlarm.Add(item);
                    }
                }
            }
        }

        public RelayCommand SwitchCommand { get; set; }

        public RelayCommand ControlCommand { get; set; }


        public Visibility CurrentDataVis { get { return _mCurrentDataVis; } set { _mCurrentDataVis = value; OnPropertyChanged(); } }
        private Visibility _mCurrentDataVis = Visibility.Visible;


        public Visibility HistoryDataVis { get { return _mHistoryDataVis; } set { _mHistoryDataVis = value; OnPropertyChanged(); } }
        private Visibility _mHistoryDataVis = Visibility.Hidden;


        /// <summary>
        /// 是否显示
        /// </summary>
        public Visibility IsVisibility { get { return _mIsVisibility; } set { _mIsVisibility = value; OnPropertyChanged(); } }
        private Visibility _mIsVisibility = Visibility.Hidden;

        /// <summary>
        /// 文字显示
        /// </summary>
        public string ButContent { get { return _mButContent; } set { _mButContent = value; OnPropertyChanged(); } }
        private string _mButContent = "历史报警";

        /// <summary>
        /// 控制按钮文本显示
        /// </summary>
        public string ControlButText { get { return _mControlButText; } set { _mControlButText = value; OnPropertyChanged(); } }
        private string _mControlButText = "报警复位";


        /// <summary>
        /// 开始时间
        /// </summary>
        public DateTime StartDateTime { get { return _mStartDateTime; } set { _mStartDateTime = value; OnPropertyChanged(); } }
        private DateTime _mStartDateTime = DateTime.Now;

        /// <summary>
        /// 结束时间
        /// </summary>
        public DateTime EndDateTime { get { return _mEndDateTime; } set { _mEndDateTime = value; OnPropertyChanged(); } }
        private DateTime _mEndDateTime = DateTime.Now;


        public ObservableCollection<Alarm> AlarmInfos { get; set; } = new ObservableCollection<Alarm>();

        public ObservableCollection<Alarm> HistoryAlarm { get; set; } = new ObservableCollection<Alarm>();

    }
}
