using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using DM_Weight.Models;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Views;
using System.Timers;
using Unity;
using System.Windows.Threading;
using Newtonsoft.Json.Linq;
using DM_Weight.msg;
using DM_Weight.HIKVISION;
using System.Threading;
using MaterialDesignThemes.Wpf;
using System.Windows.Media;
namespace DM_Weight.ViewModels
{
    public class HomeWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
    {
        private readonly ILog logger = LogManager.GetLogger(typeof(HomeWindowViewModel));
        private readonly IDialogService _dialogService;
        private UserList? _userList;
        private UserList? _userList2;
        /// 
        /// 冰箱温度
        /// 
        private string _wd = "恒温冷藏抽屉当前温度2.8(非真实数据)";
        public string WD { get => _wd; set => SetProperty(ref _wd, value); }
        System.Timers.Timer WDTimer;
        private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1");
        public bool MultiLogin
        {
            get => loginMode == 2;
        }
        private SolidColorBrush _colorBrush;
        public SolidColorBrush SnackbarBackground
        {
            get => _colorBrush;
            set => SetProperty(ref _colorBrush, value);
        }
        private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
        public ISnackbarMessageQueue SnackbarMessageQueue
        {
            get => _snackbarMessageQueue;
            set => SetProperty(ref _snackbarMessageQueue, value);
        }
        private PremissionDm? _selectedMenu;
        private PremissionDm? _selectedChildMenu;
        private List? _premissionDmList;
        public PremissionDm? SelectedChildMenu
        {
            get { return _selectedChildMenu; }
            set
            {
                //if (!_portUtil.Operate)
                //{
                //    if (value != null)
                //    {
                //        if (value.PremissionPath.Equals("TakeRecordWindow"))
                //        {
                //            //定义传参变量
                //            NavigationParameters keys = new NavigationParameters();
                //            //添加参数,键值对格式
                //            keys.Add("Type", 2);
                //            _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                //        }
                //        else if (value.PremissionPath.Equals("AddRecordWindow"))
                //        {
                //            //定义传参变量
                //            NavigationParameters keys = new NavigationParameters();
                //            //添加参数,键值对格式
                //            keys.Add("Type", 1);
                //            _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                //        }
                //        else if (value.PremissionPath.Equals("ReturnRecordWindow"))
                //        {
                //            //定义传参变量
                //            NavigationParameters keys = new NavigationParameters();
                //            //添加参数,键值对格式
                //            keys.Add("Type", 3);
                //            _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                //        }
                //        else if (value.PremissionPath.Equals("RetrunEmptyRecordWindow"))
                //        {
                //            //定义传参变量
                //            NavigationParameters keys = new NavigationParameters();
                //            //添加参数,键值对格式
                //            keys.Add("Type", 3);
                //            _regionManager.RequestNavigate("ContentRegion", value.PremissionPath, keys);
                //        }
                //        else if (value.PremissionPath.Equals("CheckRecordWindow"))
                //        {
                //            //定义传参变量
                //            NavigationParameters keys = new NavigationParameters();
                //            //添加参数,键值对格式
                //            keys.Add("Type", 4);
                //            _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                //        }
                //        else
                //        {
                //            if (value.PremissionPath.Equals("ReturnDrugWindow") || value.PremissionPath.Equals("ReturnDrugWindow2"))
                //            {
                //                if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
                //                {
                //                    _regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow2");
                //                }
                //                else
                //                {
                //                    _regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow");
                //                }
                //            }
                //            else
                //            {
                //                _regionManager.RequestNavigate("ContentRegion", value.PremissionPath);
                //            }
                //        }
                //    }
                    SetProperty(ref _selectedChildMenu, value);
                //}
            }
        }
        public PremissionDm? SelectedMenu
        {
            get { return _selectedMenu; }
            set
            {
                //if (value != null)
                //{
                //    if (value.PremissionName == "退出")
                //    {
                //        logger.Info($"用户【{Operator?.Nickname}】退出登录");
                //        Operator = null;
                //        Reviewer = null;
                //        _regionManager.RequestNavigate("MainRegion", "LoginWindow");
                //    }
                //    else
                //    {
                //        SelectedChildMenu = value.Children[0];
                //    }
                //}
                if (!_portUtil.Operate)
                {
                    SetProperty(ref _selectedMenu, value);
                }
                else
                {
                    logger.Info($"未关闭抽屉切换菜单");
                    SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
                    SnackbarMessageQueue.Enqueue("请关闭抽屉后再切换菜单");
                }
            }
        }
        private DelegateCommand _selectionCommon;
        public DelegateCommand SelectionCommon
        {
            //get => _selectionCommon ?? (_selectionCommon = new DelegateCommand(SelectionMethod));
            get => _selectionCommon ?? (_selectionCommon = new DelegateCommand(SelectionMethod));
        }
        private void SelectionMethod()
        {
            //SelectedMenu = viewName.SelectedItem as PremissionDm;
            //if (SelectedMenu.PremissionName == "退出")
            //{
            //    if (!_portUtil.Operate)
            //    {
            //        _chkFunction.HIKStopDVRRecord();
            //        logger.Info($"用户【{Operator?.Nickname}】退出登录");
            //        Operator = null;
            //        Reviewer = null;
            //        _regionManager.RequestNavigate("MainRegion", "LoginWindow");
            //    }
            //    else
            //    {
            //        logger.Info($"未关闭抽屉操作退出");
            //        SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
            //        SnackbarMessageQueue.Enqueue("请关闭抽屉后再退出");
            //        return;
            //    }
            //}
            //else
            //{
            //    //SelectedMenu.Children = SelectedMenu.Children;
            //    SelectedChildMenu = SelectedMenu.Children[0];
            //}
            logger.Info("开始进入父菜单");
            if (SelectedMenu != null && SelectedMenu.PremissionName == "退出")
            {
                logger.Info($"用户【{Operator?.Nickname}】退出登录");
                Operator = null;
                Reviewer = null;
                _regionManager.RequestNavigate("MainRegion", "LoginWindow");
            }
            else
            {
                if (!_portUtil.Operate)
                {
                    _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
                }
            }
            logger.Info("结束父菜单");
        }
        #region
        private DelegateCommand _selectionChildCommon;
        public DelegateCommand SelectionChildCommon
        {
            get => _selectionChildCommon ?? (_selectionChildCommon = new DelegateCommand(SelectionChildMethod));
        }
        private void SelectionChildMethod()
        {
            SelectChildNavigate(SelectedChildMenu);
        }
        private void SelectChildNavigate(PremissionDm SelectedChildMenu)
        {
            if (!_portUtil.Operate)
            {
                if (SelectedChildMenu != null)
                {
                    if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow"))
                    {
                        //定义传参变量
                        NavigationParameters keys = new NavigationParameters();
                        //添加参数,键值对格式
                        keys.Add("Type", 2);
                        _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                    }
                    else if (SelectedChildMenu.PremissionPath.Equals("AddRecordWindow"))
                    {
                        //定义传参变量
                        NavigationParameters keys = new NavigationParameters();
                        //添加参数,键值对格式
                        keys.Add("Type", 1);
                        _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                    }
                    else if (SelectedChildMenu.PremissionPath.Equals("ReturnRecordWindow"))
                    {
                        //定义传参变量
                        NavigationParameters keys = new NavigationParameters();
                        //添加参数,键值对格式
                        keys.Add("Type", 3);
                        _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                    }
                    else if (SelectedChildMenu.PremissionPath.Equals("RetrunEmptyRecordWindow"))
                    {
                        //定义传参变量
                        NavigationParameters keys = new NavigationParameters();
                        //添加参数,键值对格式
                        keys.Add("Type", 3);
                        _regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath, keys);
                    }
                    else if (SelectedChildMenu.PremissionPath.Equals("CheckRecordWindow"))
                    {
                        //定义传参变量
                        NavigationParameters keys = new NavigationParameters();
                        //添加参数,键值对格式
                        keys.Add("Type", 4);
                        _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
                    }
                    else
                    {
                        if (SelectedChildMenu.PremissionPath.Equals("ReturnDrugWindow") || SelectedChildMenu.PremissionPath.Equals("ReturnDrugWindow2"))
                        {
                            if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
                            {
                                _regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow2");
                            }
                            else
                            {
                                _regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow");
                            }
                        }
                        else if (SelectedChildMenu.PremissionPath.Equals("SettingMainWindow") || SelectedChildMenu.PremissionPath.Equals("SettingWindow"))
                        {
                            //if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"])>0)
                            //{
                            //    _regionManager.RequestNavigate("ContentRegion", "SettingMainWindow");
                            //}
                            //else
                            {
                                _regionManager.RequestNavigate("ContentRegion", "SettingWindow");
                            }
                        }
                        else
                        {
                            _regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath);
                        }
                    }
                }
            }
        }
        #endregion
        public List PremissionDmList { get { return _premissionDmList; } set { SetProperty(ref _premissionDmList, value); } }
        public UserList UserList { get { return _userList; } set { SetProperty(ref _userList, value); } }
        public UserList UserList2 { get { return _userList2; } set { SetProperty(ref _userList2, value); } }
        public static UserList? Operator;
        public static UserList? Reviewer;
        IRegionManager _regionManager;
        IUnityContainer _container;
        private bool _is16Drawer;
        public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
        public bool KeepAlive => false;
        private PortUtil _portUtil;
        IEventAggregator _eventAggregator;
        public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator)
        {
            _portUtil = portUtil;
            _regionManager = iRegionManager;
            _dialogService = dialogService;
            _container = container;
            this._eventAggregator = eventAggregator;
        }
        public DelegateCommand OpenFingerDialog
        {
            get => new DelegateCommand((string Type) =>
            {
                DialogParameters dialogParameters = new DialogParameters();
                dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer);
                DialogServiceExtensions.ShowDialogHost(_dialogService, "FingerprintDialog", dialogParameters, DoDialogResult, "RootDialog");
            });
        }
        public DelegateCommand OpenRecoverCommand
        {
            get => new DelegateCommand(async () =>
            {
                try
                {
                    _portUtil.WindowName = "HomeWindow";
                    _portUtil.Operate = true;
                    await _portUtil.OpenStorage();
                    _portUtil.ResetData();
                }
                catch (Exception ex)
                {
                    logger.Info($"OpenRecoverCommand异常{ex.Message}");
                }
            });
        }
        public DelegateCommand OpenEditPasswordDialog
        {
            get => new DelegateCommand((string Type) =>
            {
                DialogParameters dialogParameters = new DialogParameters();
                dialogParameters.Add("EditPass", true);
                dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer);
                DialogServiceExtensions.ShowDialogHost(_dialogService, "EditUserDialog", dialogParameters, DoDialogResult, "RootDialog");
            });
        }
        private void DoDialogResult(IDialogResult dialogResult)
        {
            // 委托   被动执行     被子窗口执行
            // dialogResult  第一方面可以拿到任意参数   第二方面   可判断关闭状态
            if (dialogResult.Result == ButtonResult.OK)
            {
            }
        }
        public void FindDrawerCount()
        {
            int count = 0;
            if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
            {
                count = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerType != 3)
                .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
            }
            else
            {
                count = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerType != 3)
                .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
            }
            Is16Drawer = count == 16;
        }
        //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback)
        {
            continuationCallback(true);
        }
        //接收导航传过来的参数
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            _portUtil.dateTime = DateTime.Now;
            //取出user
            UserList = navigationContext.Parameters.GetValue("operator");
            Operator = UserList;
            logger.Info($"发药人【{Operator.Nickname}】登录");
            if (navigationContext.Parameters.ContainsKey("reviewer"))
            {
                UserList2 = navigationContext.Parameters.GetValue("reviewer");
                Reviewer = UserList2;
                logger.Info($"审核人【{Reviewer.Nickname}】登录");
            }
            List premissions = UserList.Role.Permissions;
            if (premissions.Count <= 0)
            {
                Operator = null;
                Reviewer = null;
                Application.Current.Dispatcher.Invoke(() =>
                {
                    _regionManager.RequestNavigate("MainRegion", "LoginWindow");
                });
                AlertMsg alertMsg = new AlertMsg
                {
                    Message = $"用户{UserList.Nickname}或还未设置权限,请联系管理员",
                    Type = MsgType.ERROR
                };
                _eventAggregator.GetEvent().Publish(alertMsg);
                return;
            }
            //SqlSugarHelper.Db.SqlQueryable(sql)
            //.ToTree(pd => pd.Children, pd => pd.ParentId, 0);
            PremissionDmList = premissions;
            SelectedMenu = premissions[0];
            SelectedChildMenu = premissions[0].Children[0];
            _regionManager.RequestNavigate("ContentRegion", premissions[0].Children[0].PremissionPath);
            FindDrawerCount();
            int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
            int stopRecord = Convert.ToInt32(ConfigurationManager.AppSettings["stopRecord"] ?? "0");
            if (autoExit > 0)
            {
                logger.Info("启动自动退出检测");
                //int interval = autoExit * 1000;
                new PromiseUtil().taskAsyncLoop(1000, 0, async (options, next, stop) =>
                {
                    try
                    {
                        if (!_portUtil.Operate)
                        {
                            // 无人操作鼠标键盘
                            if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > autoExit && CheckComputerFreeState.GetLastInputTime() > autoExit)
                            {
                                logger.Info($"设备{autoExit}内无人操作,用户【{Operator?.Nickname}】自动退出登录,_portUtil.Operate:{_portUtil.Operate},totalSecond:{(DateTime.Now - _portUtil.dateTime).TotalSeconds},lastInputTime:{CheckComputerFreeState.GetLastInputTime()},autoExit:{autoExit}");
                                Operator = null;
                                Reviewer = null;
                                //Application.Current.Dispatcher.Invoke(() =>
                                //{
                                stop();
                                System.Windows.Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
                                {
                                    if (DialogHost.IsDialogOpen("RootDialog"))
                                    {
                                        DialogHost.Close("RootDialog");
                                    }
                                    _regionManager.RequestNavigate("MainRegion", "LoginWindow");
                                }));
                                //});
                                //timer.Dispose();
                            }
                            else
                            {
                                if (Operator == null)
                                {
                                    logger.Info("自动退出检测已停止");
                                    stop();
                                }
                                else
                                {
                                    logger.Info($"停止操作时间{_portUtil.dateTime},自动退出时间{autoExit},运算结果{(DateTime.Now - _portUtil.dateTime).TotalSeconds},用户上次使用系统到现在的时间间隔{CheckComputerFreeState.GetLastInputTime()}");
                                    next();
                                }
                            }
                        }
                        else
                        {
                            _portUtil.dateTime = DateTime.Now;
                            next();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Info($"自动退出异常:{ex.Message}");
                    }
                });
            }
            //if (stopRecord > 0)
            //{
            //    System.Timers.Timer timer = new System.Timers.Timer();
            //    timer.Interval = 1000;
            //    timer.Elapsed += (sender, e) =>
            //    {
            //        //指定时间内无人操作鼠标键盘则停止录像
            //        if (!_portUtil.Operate && CheckComputerFreeState.GetLastInputTime() > stopRecord)
            //        {
            //            _chkFunction.HIKStopDVRRecord();
            //        }
            //    };
            //    timer.Start();
            //}
            logger.Info($"当前时间:{DateTime.Now}\r\n获取录像机的时间");
            //获取录像机的时间
            //_chkFunction.HIK_DVR_TIME();
            //_chkFunction.HIKStartDVRRecord();
        }
        //每次导航的时候,该实列用不用重新创建,true是不重新创建,false是重新创建
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }
        //这个方法用于拦截请求
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }
    }
}