// Copyright © WireMock.Net

using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using WireMock.Logging;
using WireMock.Net.StandAlone;
using WireMock.Server;

namespace WireMock.Net;

public class Program
{
    private static readonly int SleepTime = 30000;
    private static readonly ILogger XLogger = LoggerFactory.Create(o =>
    {
        o.SetMinimumLevel(LogLevel.Debug);
        o.AddSimpleConsole(options =>
        {
            options.IncludeScopes = true;
            options.SingleLine = false;
            options.TimestampFormat = "yyyy-MM-ddTHH:mm:ss ";
        });
    }).CreateLogger("WireMock.Net");
    private static readonly IWireMockLogger Logger = new WireMockLogger(XLogger);

    private static WireMockServer _server = null!;

    static async Task Main(string[] args)
    {
        if (!StandAloneApp.TryStart(args, out _server!, Logger))
        {
            return;
        }

        Logger.Info("Press Ctrl+C to shut down");

        Console.CancelKeyPress += (s, e) =>
        {
            Stop("CancelKeyPress");
        };

        System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx =>
        {
            Stop("AssemblyLoadContext.Default.Unloading");
        };

        while (true)
        {
            Logger.Info("Server running : {0}", _server.IsStarted);
            await Task.Delay(SleepTime).ConfigureAwait(false);
        }
    }

    private static void Stop(string why)
    {
        Logger.Info("Server stopping because '{0}'", why);
        _server.Stop();
        Logger.Info("Server stopped");
    }
}