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 System.Diagnostics;
using MaterialDesignThemes.Wpf;
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;
        //System.Timers.Timer WSDTimer;
        /// 
        /// 是否有冰箱抽屉
        /// 
        private string hasFridge = ConfigurationManager.AppSettings["hasFridge"].ToString().Equals("1") ? "Visible" : "Collapsed";
        public string HasFridge { get => hasFridge; set => SetProperty(ref hasFridge, value); }
        private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1");
        public bool MultiLogin
        {
            get => loginMode == 2;
        }
        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 if (value.PremissionPath.Equals("SettingMainWindow") || value.PremissionPath.Equals("SettingWindow"))
                //            {
                //                if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"]) > 0)
                //                {
                //                    _regionManager.RequestNavigate("ContentRegion", "SettingMainWindow");
                //                }
                //                else
                //                {
                //                    _regionManager.RequestNavigate("ContentRegion", "SettingWindow");
                //                }
                //            }
                //            else
                //            {
                //                _regionManager.RequestNavigate("ContentRegion", value.PremissionPath);
                //            }
                //        }
                //    }
                if (!_socketHelper.OpenStatus)
                {
                    SetProperty(ref _selectedChildMenu, value);
                }
                else
                {
                    _socketHelper.speechSynthesizer.SpeakAsyncCancelAll();
                    _socketHelper.speechSynthesizer.Resume();
                    _socketHelper.SpeakAsync("请先关闭手术间");
                    return;
                }
                //}
            }
        }
        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);
                    }
                }
            }
            //}
        }
        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 (!_socketHelper.OpenStatus)
                {
                    SetProperty(ref _selectedMenu, value);
                    SelectionMethod();//在此处调用而不是通过前台的Triggers事件调用为了规避未关闭药箱时多次点击菜单不起作用
                }
                else
                {
                    _socketHelper.speechSynthesizer.SpeakAsyncCancelAll();
                    _socketHelper.speechSynthesizer.Resume();
                    _socketHelper.SpeakAsync("请先关闭手术间");
                    return;
                }
            }
        }
        //PremissionDm? PreSelectedMenu;
        //private DelegateCommand _selectionCommon;
        //public DelegateCommand SelectionCommon
        //{
        //    get => _selectionCommon ?? (_selectionCommon = new DelegateCommand(SelectionMethod));
        //}
        private void SelectionMethod()
        {
            //SelectedMenu = viewName.SelectedItem as PremissionDm;
            //if (SelectedMenu.PremissionName == "退出")
            //{
            //    _chkFunction.HIKStopDVRRecord();
            //    logger.Info($"用户【{Operator?.Nickname}】退出登录");
            //    Operator = null;
            //    Reviewer = null;
            //    _regionManager.RequestNavigate("MainRegion", "LoginWindow");
            //}
            //else
            //{
            //    //SelectedMenu.Children = SelectedMenu.Children;
            //    //  SelectedChildMenu = SelectedMenu.Children[0];
            //    if (!_portUtil.Operate)
            //    {
            //        _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
            //    }
            //}
          
            if (SelectedMenu != null && SelectedMenu.PremissionName == "退出")
            {
                //false是关着,true是开着
                //if (!ModbusHelper.BoxOperate)
                //if (!_socketHelper.OpenStatus)
                //{
                logger.Info($"用户【{Operator?.Nickname}】退出登录");
                Operator = null;
                Reviewer = null;
                _regionManager.RequestNavigate("ContentRegion", "EmptyWindow");
                _regionManager.RequestNavigate("MainRegion", "LoginWindow");
                //}
                //else
                //{
                //    //还有药箱开着不能退出
                //    ModbusHelper.SpeakAsync("请关闭药箱后再退出");
                //    return;
                //    SelectedMenu = _premissionDmList[0];
                //}
            }
            else
            {
                //SelectedMenu.Children = SelectedMenu.Children;
                //SelectedChildMenu = SelectedMenu.Children[0];
                if (!_socketHelper.OpenStatus)
                {
                    _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
                    logger.Info($"跳转到{SelectedMenu.Children[0].PremissionPath}");
                }
            }
        }
        #region 子菜单点击
        private DelegateCommand _selectionChildCommon;
        public DelegateCommand SelectionChildCommon
        {
            get => _selectionChildCommon ?? (_selectionChildCommon = new DelegateCommand(SelectionChildMethod));
        }
        private void SelectionChildMethod()
        {
            SelectChildNavigate(SelectedChildMenu);
        }
        #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;
        //private CHKFunction _chkFunction;
        IEventAggregator _eventAggregator;
        SocketHelper _socketHelper;
        public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator, SocketHelper socketHelper)
        {
            _portUtil = portUtil;
            _regionManager = iRegionManager;
            _dialogService = dialogService;
            _container = container;
            this._eventAggregator = eventAggregator;
            _socketHelper = socketHelper;
            _socketHelper.dateTime = DateTime.Now;
            //_chkFunction = cHKFunction;           
        }
        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;
        //}
        /// 
        /// 获取温度信息
        /// 
        //private async void GetWD(object sender, ElapsedEventArgs e)
        //{
        //    if (!_portUtil.FridgeOperate)
        //    {
        //        string retStr = string.Empty;
        //        byte[] data = null;
        //        float retT = await _portUtil.GetFridgeTemperature(1);
        //        Thread.Sleep(80);
        //        WD = $"恒温冷藏抽屉当前温度:{Math.Round((retT - 1.5), 2)}℃";
        //    }
        //}
        //private async void GetWD()
        //{
        //    if (!_portUtil.FridgeOperate)
        //    {
        //        string retStr = string.Empty;
        //        byte[] data = null;
        //        float retT = await _portUtil.GetFridgeTemperature(1);
        //        Thread.Sleep(80);
        //        WD = $"恒温冷藏抽屉当前温度:{Math.Round((retT - 1.5), 2)}℃;";
        //        if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"]) > 1)
        //        {
        //            float retTemp = await _portUtil.GetFridgeTemperature(2);
        //            Thread.Sleep(80);
        //            WD += $"{retTemp}℃";
        //        }
        //    }
        //}
        //保存温湿度信息
        private void GetWSD(object sender, ElapsedEventArgs e)
        {
            TemperatureHumidityInfo temp = _portUtil.GetWSD();
            if (temp != null)
            {
                SqlSugarHelper.Db.Insertable(new TemperatureHumidityInfo()
                {
                    GroupNo = temp.GroupNo,
                    Temp = temp.Temp,
                    Humi = temp.Humi,
                    AddTime = DateTime.Now
                }).ExecuteCommand();
                logger.Info($"保存温湿度信息:{temp.Temp},{temp.Humi}");
            }
            else
            {
                logger.Info("温湿度信息返回空");
            }
        }
        /// 
        /// 将收到的返回转换成具体温度数值
        /// 
        /// 
        /// 
        public string GetResultWD(string receiveData)
        {
            try
            {
                //string newStrWD = receiveData.Substring(10, 4);
                //logger.Info($"截取后数据newStrWD:{newStrWD}");
                int iWD = Convert.ToInt32(receiveData, 16);
                logger.Info($"截取后数据iWD:{iWD}");
                float fWD = 0;
                if (iWD != 0)
                {
                    fWD = iWD * 1.0f / 10;
                }
                logger.Info($"截取后数据fWD:{fWD}");
                string strRet = $"恒温冷藏抽屉当前温度:{fWD}℃;";
                return strRet;
            }
            catch (Exception ex)
            {
                logger.Info("GetResultWD异常", new Exception($"{ex.ToString()}"));
            }
            return "数据异常";
        }
        /// 
        /// 查看冰箱温度
        /// 
        //public DelegateCommand CheckWDCommand { get => new DelegateCommand(CheckAction); }
        //private void CheckAction()
        //{
        //    GetWD();
        //}
        //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback)
        {
            continuationCallback(true);
        }
        //接收导航传过来的参数
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            //_eventAggregator.GetEvent().Subscribe(SetLoginOut);
            _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("ContentRegion", "EmptyWindow");
                _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");
            if (autoExit > 0)
            {
                //int interval = autoExit * 1000;
                new PromiseUtil().taskAsyncLoop(1000, 0, async (options, next, stop) =>
                {
                    try
                    {
                        if (!_socketHelper.OpenStatus)
                        {
                            // 无人操作鼠标键盘
                            if ((DateTime.Now - _socketHelper.dateTime).TotalSeconds > autoExit && CheckComputerFreeState.GetLastInputTime() > autoExit)
                            {
                                logger.Info($"设备内无人操作,用户【{Operator?.Nickname}】自动退出登录.autoExit:{autoExit};socketTime:{_socketHelper.dateTime};totalSeconds:{(DateTime.Now - _socketHelper.dateTime).TotalSeconds}{_socketHelper.dateTime};LastInputTime:{CheckComputerFreeState.GetLastInputTime()}");
                                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("ContentRegion", "EmptyWindow");
                                    _regionManager.RequestNavigate("MainRegion", "LoginWindow");
                                }));
                                //});
                                //timer.Dispose();
                            }
                            else
                            {
                                if (Operator == null)
                                {
                                    stop();
                                }
                                else
                                {
                                    next();
                                }
                            }
                        }
                        else
                        {
                            _socketHelper.dateTime = DateTime.Now;
                            next();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Info($"自动退出异常:{ex.Message}");
                    }
                });
            }
        }
        //每次导航的时候,该实列用不用重新创建,true是不重新创建,false是重新创建
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }
        //这个方法用于拦截请求
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            //退了登录
            //_eventAggregator.GetEvent().Unsubscribe(SetLoginOut);
        }
        //private void SetLoginOut()
        //{
        //    //_chkFunction.HIKStopDVRRecord();
        //    Operator = null;
        //    Reviewer = null;
        //    //Application.Current.Dispatcher.Invoke(() =>
        //    //{
        //    _regionManager.RequestNavigate("MainRegion", "LoginWindow");
        //    //});
        //}
    }
}