using System;
using System.Configuration;
using System.Diagnostics;
using Serilog;
using Serilog.Exceptions;
using Serilog.Formatting.Elasticsearch;
using Serilog.Sinks.Elasticsearch;
using LogEventLevel = Serilog.Events.LogEventLevel;

namespace Kreta.Web.Logger
{
    public static class HangfireLogger
    {
        public static void SerilogGlobalConfiguration()
        {
#if DEBUG
            Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
#endif

            Enum.TryParse<LogEventLevel>(ConfigurationManager.AppSettings["serilog:minimum-level"], true, out LogEventLevel logEventLevel);
            var nodeUris = ConfigurationManager.AppSettings["serilog:write-to:Elasticsearch.nodeUris"];
            var indexFormat = ConfigurationManager.AppSettings["serilog:write-to:Elasticsearch.indexFormat"];
            bool.TryParse(ConfigurationManager.AppSettings["serilog:write-to:Elasticsearch.autoRegisterTemplate"], out var autoRegisterTemplate);
            Enum.TryParse<AutoRegisterTemplateVersion>(ConfigurationManager.AppSettings["serilog:write-to:Elasticsearch.autoRegisterTemplateVersion"], true, out AutoRegisterTemplateVersion autoRegisterTemplateVersion);

            Log.Logger = new LoggerConfiguration()
                 .Enrich.WithExceptionDetails()
                 .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(nodeUris))
                 {
                     IndexFormat = indexFormat,
                     MinimumLogEventLevel = logEventLevel,
                     AutoRegisterTemplate = autoRegisterTemplate,
                     AutoRegisterTemplateVersion = autoRegisterTemplateVersion,
                     CustomFormatter = new ExceptionAsObjectJsonFormatter(renderMessage: true)
                 })
                 .CreateLogger();
        }

        public static void ShutdownSerilog()
        {
            Log.CloseAndFlush();
        }
    }
}