using DM_Weight.Finger;
using DM_Weight.Port;
using DM_Weight.util.TabTip;
using DM_Weight.util;
using DM_Weight.ViewModels;
using DM_Weight.Views.Dialog;
using DM_Weight.Views;
using log4net.Config;
using Prism.Ioc;
using Prism.Services.Dialogs;
using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using Prism.Unity;
using log4net;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace DM_Weight
{
    /// 
    /// Interaction logic for App.xaml
    /// 
    public partial class App : PrismApplication
    {
        public static bool DbConnectionFail { get; set; } = false;
        private readonly ILog logger = LogManager.GetLogger(typeof(App));
        public App()
        {
            TabTipAutomation.IgnoreHardwareKeyboard = HardwareKeyboardIgnoreOptions.IgnoreAll;
            TabTipAutomation.BindTo();
            TabTipAutomation.BindTo();
        }
        protected override Window CreateShell()
        {
            logger.Info("进入APP-CreateShell");
            //UI线程未捕获异常处理事件
            this.DispatcherUnhandledException += OnDispatcherUnhandledException;
            //Task线程内未捕获异常处理事件
            TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;
            //多线程异常
            AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
            logger.Info("进入APP-CreateShell-2");
            return Container.Resolve();
        }
        void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            logger.Error($"发生错误:{e.Exception.Message}");
            e.Handled = true; if (e.Exception.Message.Contains("连接数据库过程中发生错误"))
            {
                DbConnectionFail = true;
                Container.Resolve();
            }
        }
        void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            foreach (Exception item in e.Exception.InnerExceptions)
            {
                logger.Error($"异常类型:{item.GetType()}{Environment.NewLine}来自:{item.Source}{Environment.NewLine}异常内容:{item.Message}");
            }
            //将异常标识为已经观察到 
            e.SetObserved();
        }
        void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            logger.Error($"Unhandled exception.{e.ToString()}");
        }
        protected override void InitializeShell(Window shell)
        {
            base.InitializeShell(shell);
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            logger.Info("进入APP-RegisterTypes");
            // 注入日志
            XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
            //containerRegistry.RegisterInstance(LogManager.GetLogger(""));
            // 串口工具
            containerRegistry.RegisterSingleton();
            containerRegistry.RegisterSingleton();
            // 指纹机工具
            containerRegistry.RegisterSingleton();
            // 组态屏工具
            //containerRegistry.RegisterSingleton();
            // 录像机
            //containerRegistry.RegisterSingleton();
            containerRegistry.Register();
            // 主窗口
            containerRegistry.Register();
            containerRegistry.RegisterForNavigation();
            // 分页
            //containerRegistry.Register();
            //containerRegistry.Register();
            // 登录页面
            containerRegistry.RegisterForNavigation();
            // 布局页面
            containerRegistry.RegisterForNavigation();
            // 录入指纹模态框
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            #region 取药
            // 处方取药页面
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterForNavigation();
            ////交接柜补药
            //containerRegistry.RegisterForNavigation();
            // 处方取药模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 调拨取药页面
            //containerRegistry.RegisterForNavigation();
            //// 调拨取药模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 抽屉取药页面
            //containerRegistry.RegisterForNavigation();
            //// 自选取药模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 自选取药页面
            //containerRegistry.RegisterForNavigation();
            ////多处方取药
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            ////手术排程
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //开药箱
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterForNavigation();
            //交接柜补药
            containerRegistry.RegisterForNavigation();
            //核对处方
            //containerRegistry.RegisterForNavigation();
            //管理员根据药箱进行核对处方
            containerRegistry.RegisterForNavigation();
            //麻醉师核对其名下单子
            containerRegistry.RegisterForNavigation();
            //管理员根据药箱进行核对处方
            containerRegistry.RegisterForNavigation();
            //麻醉师核对其名下单子
            containerRegistry.RegisterForNavigation();
            #endregion
            //#region 加药
            // 自选加药页面
            //containerRegistry.RegisterForNavigation();
            //// 调拨加药页面
            //containerRegistry.RegisterForNavigation();
            //// 调拨取药模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 抽屉加药页面
            //containerRegistry.RegisterForNavigation();
            //// 自选加药模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            ////多批次抽屉加药
            //containerRegistry.RegisterForNavigation();
            ////药品请领
            //containerRegistry.RegisterForNavigation();
            //// 药品请领模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation(); 
            ////请领列表
            //containerRegistry.RegisterForNavigation();
            ////请领入库
            //containerRegistry.RegisterForNavigation();
            //#endregion
            //#region 还药
            //// 还药页面
            //containerRegistry.RegisterForNavigation();
            //// 按记录归还药品模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 还药页面2
            //containerRegistry.RegisterForNavigation();
            //// 按处方归还药品模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 还空瓶页面
            //containerRegistry.RegisterForNavigation();
            ////空瓶销毁页面
            //containerRegistry.RegisterForNavigation();
            //// 归还空瓶模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //// 空瓶销毁模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //#endregion
            //#region 库存管理
            //// 库存列表页面
            //containerRegistry.RegisterForNavigation();
            //// 库位绑定模态框
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            ////同一药品多批次库位绑定
            //containerRegistry.RegisterForNavigation();
            //// 库存盘点页面
            //containerRegistry.RegisterForNavigation();
            //// 药品列表页面
            //containerRegistry.RegisterForNavigation();
            ////交接班记录
            //containerRegistry.RegisterForNavigation();
            ////交接班弹窗
            //containerRegistry.RegisterDialog();
            //containerRegistry.RegisterForNavigation();
            //containerRegistry.RegisterForNavigation();
            //#endregion
            #region 系统设置
            // 用户管理页面
            containerRegistry.RegisterForNavigation();
            // 编辑用户模态框
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            // 角色管理页面
            containerRegistry.RegisterForNavigation();
            // 系统设置
            containerRegistry.RegisterForNavigation();
            // 调试页面
            //containerRegistry.RegisterForNavigation();
            //主设置页面
            containerRegistry.RegisterForNavigation();
            //两个冰箱抽屉设置页面
            //containerRegistry.RegisterForNavigation();
            ////只有一个冰箱抽屉设置页面
            //containerRegistry.RegisterForNavigation();
            //药箱绑定
            containerRegistry.RegisterForNavigation();
            //药箱设置
            containerRegistry.RegisterForNavigation();
            //操作记录
            containerRegistry.RegisterForNavigation();
            //温湿度记录
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            //盘点
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            //账册
            containerRegistry.RegisterForNavigation();
            //药品转移药箱
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterDialog();
            #endregion
            // 设备记录页面
            //containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterForNavigation();
            //空页面,用于跳出登录时跳转以避免不走OnNavigatedFrom情况
            containerRegistry.RegisterForNavigation();
            //紧急开锁页面
            containerRegistry.RegisterForNavigation();
            //日期加时间页面
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterDialog();
            containerRegistry.RegisterForNavigation();
            containerRegistry.RegisterForNavigation();
            logger.Info("结束APP-RegisterTypes");
        }
        private void PrismApplication_Startup(object sender, StartupEventArgs e)
        {
            //获取欲启动程序名
            string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
            logger.Info($"欲启动程序名:{processName}");
            //检查程序是否已经启动,已经启动则显示提示退出程序
            if (System.Diagnostics.Process.GetProcessesByName(processName).Length > 1)
            {
                logger.Info($"系统在运行!");
                //系统在运行
                RaiseOtherProcess();
                Application.Current.Shutdown();
                return;
            }
        }
        private static void RaiseOtherProcess()
        {
            Process proc = Process.GetCurrentProcess();
            foreach (Process otherProc in Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
            {
                if (proc.Id != otherProc.Id)
                {
                    IntPtr hWnd = otherProc.MainWindowHandle;
                    if (IsIconic(hWnd))
                    {
                        ShowWindowAsync(hWnd, 9);
                    }
                    SetForegroundWindow(hWnd);
                    break;
                }
            }
        }
        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
        [DllImport("user32.dll")]
        private static extern bool IsIconic(IntPtr hWnd);
    }
}