using AnsonBot.Bot;
using AnsonBot.Core;
using Discord;
using Discord.Interactions;
using Discord.WebSocket;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var builder = Host.CreateApplicationBuilder(args);

// config binding
builder.Services.Configure<DockerOptions>(builder.Configuration.GetSection("Docker"));
builder.Services.Configure<DiscordOptions>(builder.Configuration.GetSection("Discord"));
builder.Services.Configure<TrackerOptions>(builder.Configuration.GetSection("Tracker"));

// our services
builder.Services.AddSingleton<IRconService, DockerRconService>();

// persistence
builder.Services.AddDbContextFactory<BotDbContext>(o =>
    o.UseNpgsql(builder.Configuration.GetConnectionString("Postgres")));

// Registered as a singleton as well as a hosted service so the /players command
// and the notifier resolve the same instance the polling loop runs on.
builder.Services.AddSingleton<PlayerTrackerService>();
builder.Services.AddHostedService(x => x.GetRequiredService<PlayerTrackerService>());

// discord
builder.Services.AddSingleton(new DiscordSocketConfig
{
    GatewayIntents = GatewayIntents.Guilds,
    AlwaysDownloadUsers = false,
    LogLevel = LogSeverity.Info
});
builder.Services.AddSingleton<DiscordSocketClient>();
builder.Services.AddSingleton(x => new InteractionService(
    x.GetRequiredService<DiscordSocketClient>()));

// dev-only: tunnel to the home server's Docker socket.
// Registered first so it starts before the bot and stops after it.
if (builder.Environment.IsDevelopment())
{
    builder.Services.Configure<SshTunnelOptions>(builder.Configuration.GetSection("SshTunnel"));
    builder.Services.AddHostedService<SshTunnelService>();
}

// the runner
builder.Services.AddHostedService<BotHostedService>();

// subscribes to tracker events; after BotHostedService so the client exists
builder.Services.AddHostedService<PlayerNotificationService>();

var app = builder.Build();
await app.RunAsync();




//DiscordSocketConfig config = new()
//{
//    GatewayIntents = GatewayIntents.All | GatewayIntents.GuildMembers | GatewayIntents.GuildBans
//};

//DiscordSocketClient _client = new(config);
//DiscordService service = new(_client);

//var token = "MTUyNjk1Njk4MTM5MzI5MzQxMg.G46bg4.RTqBp1gvtEirLUtbojdpktz9MCZF76Sm4ecqOo";
//await _client.LoginAsync(TokenType.Bot, token);
//await _client.StartAsync();

//_client.Ready += service.ClientReady;
//_client.SlashCommandExecuted += service.SlashHandler;

//Console.WriteLine("Events registered!");
//await Task.Delay(-1);