📄 src/Api/Program.cs
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Quartz;
using Quartz.AspNetCore;
using Slopper.Api;
using Slopper.Api.YouTubeAuth;
using Slopper.Domain;
using Slopper.Infrastructure.Ai;
using Slopper.Infrastructure.Database;
using Slopper.Infrastructure.Ffmpeg;
using Slopper.Infrastructure.YouTube;

// using Winton.Extensions.Configuration.Consul;

var builder = WebApplication.CreateBuilder(args);

// builder.Configuration.AddConsul(
//     "slopper",
//     options =>
//     {
//         options.ConsulConfigurationOptions = options => options.Address = new(builder.Configuration["Consul:Address"]!);
//         options.ReloadOnChange = true;
//     }
// );

builder.ConfigureOpenTelemetry();

builder.Services.AddOpenApi();

builder.Services.AddClipSelector().AddClipGenerator().AddCleaner();

builder.Services.AddJellyfinDatabase().AddSlopperDatabase().AddFfmpegServices().AddAi().AddYouTubeUploader();

builder
    .Services.AddClipGenerationJobOptions()
    .AddQuartz() //quartz => quartz.AddClipGenerationJob().AddCleanupJob())
    .AddQuartzServer();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie().AddYouTube();

builder.Services.AddAuthorizationBuilder().AddYouTubePolicy();

using var app = builder.Build();

if (builder.Environment.IsDevelopment())
{
    app.UseCookiePolicy(new() { MinimumSameSitePolicy = SameSiteMode.Lax });
}

app.UseAuthentication();
app.UseAuthorization();

app.MapOpenApi();

app.MapApi();

app.UseDefaultFiles();
app.UseStaticFiles();

app.MapGet("/admin/youtube", (HttpContext httpContext) => httpContext.User.Identity?.Name)
    .RequireYouTubeAuthorization();

app.Run();