namespace Server.Services;

using System.Net;
using System.Net.Sockets;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NetCoreServer;

public class WonderkingAuthServer : TcpServer, IHostedService
{
    private readonly ILogger<WonderkingAuthServer> _logger;
    private readonly IServiceProvider _serviceProvider;

    public WonderkingAuthServer(IPAddress address, int port, ILogger<WonderkingAuthServer> logger,
        IServiceProvider serviceProvider) : base(address, port)
    {
        this._logger = logger;
        this._serviceProvider = serviceProvider;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        this.Start();
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        this.Stop();
        return Task.CompletedTask;
    }

    protected override TcpSession CreateSession() =>
        ActivatorUtilities.CreateInstance<AuthSession>(this._serviceProvider, this);

    protected override void OnStarting()
    {
        this._logger.LogInformation("Starting");
        base.OnStarting();
    }

    protected override void OnStarted()
    {
        this._logger.LogInformation("Started");
        base.OnStarted();
    }

    protected override void OnStopping()
    {
        this._logger.LogInformation("Stopping");
        base.OnStopping();
    }

    protected override void OnStopped()
    {
        this._logger.LogInformation("Stopped");
        base.OnStopped();
    }

    protected override void OnError(SocketError error) => this._logger.LogError("An error has occured {Error}", error);
}