using System.Net;
using GServer.Server.Business.Services;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace GServer.Server;

// ReSharper disable once ClassNeverInstantiated.Global
internal sealed class Program
{
    private const int ListenPort = 11000;

    private static async Task Main(string[] args)
    {
        HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

        // Register services
        _ = builder.Services.AddScoped<IAuthService, AuthService>();
        _ = builder.Services.AddScoped<ITcpMessageHandler, TcpMessageHandler>();
        _ = builder.Services.AddTransient<ITcpGameServer>((services) =>
        {
            return new TcpGameServer(
                new IPEndPoint(IPAddress.Any, ListenPort),
                services.GetRequiredService<ITcpMessageHandler>()
            );
        });

        // Start service
        using IHost host = builder.Build();
        ApplicationLifetime(host.Services);
        await host.RunAsync();
    }

    private static void ApplicationLifetime(IServiceProvider hostProvider)
    {
        using IServiceScope serviceScope = hostProvider.CreateScope();

        Thread serverWorker = new(() =>
        {
            ITcpGameServer server = serviceScope.ServiceProvider.GetRequiredService<ITcpGameServer>();
            server.Start();

            while (true)
            {
                // Sleep to not consume too much CPU while waiting
                Thread.Sleep(1000);
            }
        });

        serverWorker.Start();
        serverWorker.Join(); // Wait for the thread to complete before disposing the scope
    }
}