using System;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using MediatR;
using IRaCIS.Core.Application.MediatR.Handlers;
using System.Threading.Tasks;
using MassTransit;
using MassTransit.NewIdProviders;
using System.IO;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using IRaCIS.Core.Infrastructure;
using System.Net.NetworkInformation;
using System.Linq;
using System.Text.Json.Nodes;
using Microsoft.EntityFrameworkCore;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.Data.SqlClient;

namespace IRaCIS.Core.API
{
    public class Program
    {
        public readonly string environment;
        public  static async Task Main(string[] args)
        {



            try
            {
                //以配置文件为准，否则 从url中取环境值(服务以命令行传递参数启动，配置文件配置了就不需要传递环境参数)
                var config = new ConfigurationBuilder()
                            .AddEnvironmentVariables()
                            .Build();

                var enviromentName = config["ASPNETCORE_ENVIRONMENT"];

                if (string.IsNullOrWhiteSpace(enviromentName))
                {

                    var index = Array.IndexOf(args, "--env");
                    enviromentName = index > -1
                        ? args[index + 1]
                        : "Development";
                }

                //Dicom 浏览
                //ImageManager.SetImplementation(WinFormsImageManager.Instance);

                var host = CreateHostBuilder(args)
                    .UseEnvironment(enviromentName) //命令行传入环境
                    .ConfigureAppConfiguration((hostContext, config) =>
                    {

                        //Console.WriteLine(hostContext.HostingEnvironment.EnvironmentName);                
                        config.AddJsonFile("appsettings.json", false, true)
                                  .AddJsonFile($"appsettings.{enviromentName}.json", false, true);
                    })
                    .Build();



                NewId.SetProcessIdProvider(new CurrentProcessIdProvider());




                //// Serilog 
                SerilogExtension.AddSerilogSetup(enviromentName, host.Services);



                #region 认证程序

                if (!File.Exists($@"C:\ProgramData\.xingcang\config.json"))
                {
                    Console.WriteLine("当前未注册");
                    Log.Logger.Error("当前未注册");
                    Console.ReadLine();
                    return;
                }
                else
                {
                    var json = File.ReadAllText($@"C:\ProgramData\.xingcang\config.json");

                    JObject jsonObject = JObject.Parse(json);

                    var key = jsonObject["key"].ToString();

                    var value = jsonObject["value"].ToString();


                    var physicalAddressList = NetworkInterface.GetAllNetworkInterfaces().Select(t => t.GetPhysicalAddress().ToString());

                    // 判断文件里面的机器码是否是本机的
                    if (!physicalAddressList.Contains(key))
                    {
                        Console.WriteLine("机器码和本机不对应");
                        Log.Logger.Error("机器码和本机不对应");
                        Console.ReadLine();

                        return;
                    }


                    var secrete = MD5Helper.Md5($"{key}_XINGCANG");

                    if (value != secrete)
                    {
                        Console.WriteLine("机器码和注册码不匹配");
                        Log.Logger.Error("机器码和注册码不匹配");
                        Console.ReadLine();

                        return;

                    }

                }

                #endregion



                //缓存项目的状态  匿名化数据
                await InitCache(host);



                host.Run();

                Log.Logger.Warning($"当前环境：{enviromentName}");

            }
            catch (Exception e)
            {

                Log.Logger.Error(e.InnerException is null ? e.Message + e.StackTrace : e.InnerException?.Message + e.InnerException?.StackTrace);
            }




        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureKestrel((context, options) =>
                     {
                         //设置应用服务器Kestrel请求体最大为1GB // if don't set default value is: 30 MB
                         options.Limits.MaxRequestBodySize = long.MaxValue;
                         options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30);
                         options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(20);

                     });
                    //webBuilder.UseSerilog();//在宿主机启动的时候配置serilog,与微软ILogger进行整合
                    webBuilder.UseStartup<Startup>();
                }).UseSerilog()
                .UseServiceProviderFactory(new AutofacServiceProviderFactory());//使用Autofac替代本身容器
                                                                                //ConfigureLogging(logging =>
                                                                                //{
                                                                                //    logging.ClearProviders();
                                                                                //    logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                                                                                //})
                                                                                //.UseNLog()
                                                                                // NLog: Setup NLog for Dependency injection;




        private static async Task InitCache(IHost host)
        {
            var _mediator = host.Services.GetService(typeof(IMediator)) as IMediator;

            await _mediator.Send(new AnonymizeCacheRequest());

            await _mediator.Send(new TrialStateCacheRequest());
        }

    }
}
