using EVCB_OCPP.Domain;
using EVCB_OCPP.WSServer.Message;
using EVCB_OCPP.WSServer.Service;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using NLog;
using NLog.Web;
using NLog.Extensions.Logging;
using System.IO;
using System.Data.Common;
using Microsoft.Data.SqlClient;
using EVCB_OCPP.WSServer.Helper;
using Quartz;
using EVCB_OCPP.WSServer.Jobs;
using Microsoft.AspNetCore.Builder;

namespace EVCB_OCPP.WSServer
{
   
    class Program
    {
        static void Main(string[] args)
        {
            AppContext.SetData("System.Net.Security.TlsCacheSize", 200);

            Console.WriteLine("====================================================================================================");
            Console.WriteLine("=================" +
                "===================================================================================");
            Console.WriteLine("==                                                                                                ==");
            Console.WriteLine("==       ------------               -----------      -------------         -------------          ==");
            Console.WriteLine("==    ---            ---       ----                  ----------------      ----------------       ==");
            Console.WriteLine("==    ---            ---     ----                    ----            ---   ----            ---    ==");
            Console.WriteLine("==    ---            ---    ----                     ----            ---   ----            ---    ==");
            Console.WriteLine("==    ---            ---    ----                     ---- -------------    ---- -------------     ==");
            Console.WriteLine("==    ---            ---    ----                     ---- -----------      ---- -----------       ==");
            Console.WriteLine("==    ---            ---      ----                   ----                  ----                   ==");
            Console.WriteLine("==    ---            ---        ----                 ----                  ----                   ==");
            Console.WriteLine("==       -----------                -----------      ----                  ----                   ==");
            Console.WriteLine("==                                                                                                ==");
            Console.WriteLine("====================================================================================================");
            Console.WriteLine("====================================================================================================");

            ThreadPool.GetMaxThreads(out var workerThreads, out var completionThreads);
            Console.WriteLine($"Max ThreadPool workerThreads:{workerThreads} completionThreads:{completionThreads}");
            ThreadPool.SetMinThreads((int)(10), (int)(0));

            IHost host = Host.CreateDefaultBuilder(args)
                //.UseEnvironment("Development")
                //.ConfigureLogging((context, builder) => { 
                //    builder.ClearProviders();
                //    builder.AddAzureWebAppDiagnostics();
                //    NLog.LogManager.Configuration = new NLogLoggingConfiguration(context.Configuration.GetSection("NLog"));
                //})
                //.UseNLog()
                .AddLogServcie()
                .ConfigureServices((hostContext, services) =>
                {
                    //services.AddSingleton<MeterValueGroupSingleHandler>();
                    services.AddSingleton<IHostLifetime, DummyHostLifeTime>();

                    services.AddProtalServer(hostContext.Configuration);

                    services.AddTransient<BlockingTreePrintService>();
                    services.AddTransient<GoogleGetTimePrintService>();
                })
                .Build();

            host.Run();
        }

        public static object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            DateTime? timevalue = null;
            if (reader.Value != null)
            {
                DateTime date = ((DateTime)reader.Value).ToLocalTime();
                timevalue = new DateTime(date.Year, date.Month, date.Day, date.TimeOfDay.Hours, date.TimeOfDay.Minutes, date.TimeOfDay.Seconds, 000);
            }
            return timevalue;
        }
    }
}