using DevExpress.LookAndFeel;
using DevExpress.Skins;
using DevExpress.UserSkins;
using DevExpress.XtraEditors;
using DevExpress.XtraWaitForm;
using Serilog;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;

namespace DbBackup
{
    internal static class Program
    {
        static Program()
        {
            //设置私有路径
            Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
            AppDomain.CurrentDomain.SetData("PRIVATE_BINPATH", "AddIns;");
            var m = typeof(AppDomainSetup).GetMethod("UpdateContextProperty", BindingFlags.NonPublic | BindingFlags.Static);
            var funsion = typeof(AppDomain).GetMethod("GetFusionContext", BindingFlags.NonPublic | BindingFlags.Instance);
            m.Invoke(null, new object[] { funsion.Invoke(AppDomain.CurrentDomain, null), "PRIVATE_BINPATH", "AddIns;" });

            //c++dll加入环境变量
            string paths = Environment.GetEnvironmentVariable("PATH");
            var dirs = Directory.EnumerateDirectories("AddIns", "*", SearchOption.AllDirectories);
            List<string> list = new List<string>
            {
                Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AddIns")
            };
            foreach (var item in dirs)
            {
                list.Add(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, item));
            }
            Environment.SetEnvironmentVariable("PATH", $"{paths};{string.Join(";", list)}");

            AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
            {
                var ex = e.ExceptionObject as Exception;
                while (ex.InnerException != null)
                    ex = ex.InnerException;
                Serilog.Log.Error(ex, "出现未处理的异常,程序即将退出!");
                DxHelper.MsgBoxHelper.ShowError("出现未处理的异常,程序即将退出!");
            };
            Application.ThreadException += (sender, e) =>
            {
                var ex = e.Exception;
                while (ex.InnerException != null)
                    ex = ex.InnerException;
                DxHelper.MsgBoxHelper.ShowError($"出现未处理的线程异常!{e.Exception.Message}");
                Serilog.Log.Error(e.Exception, "出现未处理的线程异常");
            };
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            string outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}  {Exception}";
            Serilog.Log.Logger = new Serilog.LoggerConfiguration()
                .WriteTo.Console(outputTemplate: outputTemplate)
                .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Information)
                    .WriteTo.File("Logs\\Info\\.log", rollingInterval: Serilog.RollingInterval.Day))
                .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Warning)
                    .WriteTo.File("Logs\\Warning\\.log", rollingInterval: Serilog.RollingInterval.Day))
                .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Error)
                    .WriteTo.File("Logs\\Error\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
                .CreateLogger();

            WindowsFormsSettings.AllowDpiScale = true;
            WindowsFormsSettings.AllowHoverAnimation = DevExpress.Utils.DefaultBoolean.True;
            WindowsFormsSettings.AllowDefaultSvgImages = DevExpress.Utils.DefaultBoolean.True;
            WindowsFormsSettings.AllowRoundedWindowCorners = DevExpress.Utils.DefaultBoolean.True;
            WindowsFormsSettings.AnimationMode = AnimationMode.EnableAll;
            WindowsFormsSettings.BackgroundSkinningMode = BackgroundSkinningMode.AllColors;
            WindowsFormsSettings.DefaultAllowHtmlDraw = true;
            WindowsFormsSettings.DefaultLookAndFeel.SetSkinStyle(SkinStyle.WXICompact);
            WindowsFormsSettings.DefaultFont = new System.Drawing.Font("微软雅黑", 10f);
            WindowsFormsSettings.SetPerMonitorDpiAware();
            ChsLocalizer.UseChs();
            System.Windows.Forms.Application.Run(new Form1());
        }
    }
}
