using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows;
namespace FastGithub.UI
{
    /// 
    /// App.xaml 的交互逻辑
    /// 
    public partial class App : Application
    {
        private readonly Mutex globalMutex;
        private readonly bool isFirstInstance;
        public App()
        {
            this.globalMutex = new Mutex(true, "Global\\FastGithub.UI", out this.isFirstInstance);
            AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
        }
        /// 
        /// 程序集加载失败时
        /// 
        /// 
        /// 
        /// 
        private static Assembly? OnAssemblyResolve(object sender, ResolveEventArgs args)
        {
            var name = new AssemblyName(args.Name).Name;
            if (name.EndsWith(".resources"))
            {
                return default;
            }
            var stream = GetResourceStream(new Uri($"Resource/{name}.dll", UriKind.Relative)).Stream;
            var buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);
            return Assembly.Load(buffer);
        }
        /// 
        /// 程序启动
        /// 
        /// 
        protected override void OnStartup(StartupEventArgs e)
        {
            if (this.isFirstInstance == false)
            {
                this.Shutdown();
            }
            else
            {               
                StartFastGithub(); 
                SetWebBrowserVersion(9000);
            }
            base.OnStartup(e);
        }
        /// 
        /// 设置浏览器版本
        /// 
        /// 
        private static void SetWebBrowserVersion(int version)
        {
            var registry = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
            var key = $"{Process.GetCurrentProcess().ProcessName}.exe";
            registry.SetValue(key, version, RegistryValueKind.DWord);
        }
        /// 
        /// 启动fastgithub
        /// 
        /// 
        private static void StartFastGithub()
        {
            const string fileName = "fastgithub.exe";
            if (File.Exists(fileName) == false)
            {
                return;
            }
            var startInfo = new ProcessStartInfo
            {
                FileName = fileName,
                Arguments = $"ParentProcessId={Process.GetCurrentProcess().Id} UdpLoggerPort={UdpLogger.Port}",
                UseShellExecute = false,
                CreateNoWindow = true
            };
            Process.Start(startInfo);
        }
        /// 
        /// 程序退出
        /// 
        /// 
        protected override void OnExit(ExitEventArgs e)
        {
            this.globalMutex.Dispose();
            base.OnExit(e);
        }
    }
}