using PlotLine.Data;
using PlotLine.Services;
using Microsoft.AspNetCore.DataProtection;

namespace PlotLine;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.Logging.ClearProviders();
        builder.Logging.AddConsole();
        builder.Logging.AddDebug();

        builder.Services.AddControllersWithViews();
        builder.Services.AddDataProtection()
            .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(builder.Environment.ContentRootPath, "App_Data", "DataProtectionKeys")));
        builder.Services.AddSingleton<ISqlConnectionFactory, SqlConnectionFactory>();
        builder.Services.AddScoped<IProjectRepository, ProjectRepository>();
        builder.Services.AddScoped<IBookRepository, BookRepository>();
        builder.Services.AddScoped<IChapterRepository, ChapterRepository>();
        builder.Services.AddScoped<ISceneRepository, SceneRepository>();
        builder.Services.AddScoped<ILookupRepository, LookupRepository>();
        builder.Services.AddScoped<ITimelineRepository, TimelineRepository>();
        builder.Services.AddScoped<ITimelinePresetRepository, TimelinePresetRepository>();
        builder.Services.AddScoped<ITimelineSettingsRepository, TimelineSettingsRepository>();
        builder.Services.AddScoped<ISceneMetricTypeRepository, SceneMetricTypeRepository>();
        builder.Services.AddScoped<IPlotRepository, PlotRepository>();
        builder.Services.AddScoped<IAssetRepository, AssetRepository>();
        builder.Services.AddScoped<ICharacterRepository, CharacterRepository>();
        builder.Services.AddScoped<ILocationRepository, LocationRepository>();
        builder.Services.AddScoped<IWarningRepository, WarningRepository>();
        builder.Services.AddScoped<ISceneDependencyRepository, SceneDependencyRepository>();
        builder.Services.AddScoped<IAnalyticsRepository, AnalyticsRepository>();
        builder.Services.AddScoped<IStoryBibleRepository, StoryBibleRepository>();
        builder.Services.AddScoped<IWriterWorkspaceRepository, WriterWorkspaceRepository>();
        builder.Services.AddScoped<IExportRepository, ExportRepository>();
        builder.Services.AddScoped<IProjectBackupRepository, ProjectBackupRepository>();
        builder.Services.AddScoped<IProjectRestorePointRepository, ProjectRestorePointRepository>();
        builder.Services.AddScoped<IDynamicsRepository, DynamicsRepository>();
        builder.Services.AddScoped<IScenarioRepository, ScenarioRepository>();
        builder.Services.AddScoped<IArchiveRepository, ArchiveRepository>();
        builder.Services.AddScoped<IAcceptanceRepository, AcceptanceRepository>();
        builder.Services.AddScoped<IImportRepository, ImportRepository>();
        builder.Services.AddScoped<IProjectService, ProjectService>();
        builder.Services.AddScoped<IBookService, BookService>();
        builder.Services.AddScoped<IChapterService, ChapterService>();
        builder.Services.AddScoped<ISceneService, SceneService>();
        builder.Services.AddScoped<ITimelineService, TimelineService>();
        builder.Services.AddScoped<ISceneMetricTypeService, SceneMetricTypeService>();
        builder.Services.AddScoped<IPlotService, PlotService>();
        builder.Services.AddScoped<IAssetService, AssetService>();
        builder.Services.AddScoped<ICharacterService, CharacterService>();
        builder.Services.AddScoped<ILocationService, LocationService>();
        builder.Services.AddScoped<IContinuityValidationService, ContinuityValidationService>();
        builder.Services.AddScoped<IAnalyticsService, AnalyticsService>();
        builder.Services.AddScoped<IStoryBibleService, StoryBibleService>();
        builder.Services.AddScoped<IRelationshipMapService, RelationshipMapService>();
        builder.Services.AddScoped<IWriterWorkspaceService, WriterWorkspaceService>();
        builder.Services.AddScoped<IExportService, ExportService>();
        builder.Services.AddScoped<IProjectExportService, ProjectExportService>();
        builder.Services.AddScoped<IProjectRestorePointService, ProjectRestorePointService>();
        builder.Services.AddScoped<IProjectRestoreService, ProjectRestoreService>();
        builder.Services.AddScoped<IDynamicsService, DynamicsService>();
        builder.Services.AddScoped<IScenarioService, ScenarioService>();
        builder.Services.AddScoped<IArchiveService, ArchiveService>();
        builder.Services.AddScoped<IAcceptanceService, AcceptanceService>();
        builder.Services.AddScoped<IImportService, ImportService>();
        builder.Services.AddSingleton<IHelpService, HelpService>();
        builder.Services.AddSingleton<IHelpMarkdownRenderer, HelpMarkdownRenderer>();

        var app = builder.Build();

        if (!app.Environment.IsDevelopment())
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseAuthorization();

        app.MapStaticAssets();
        app.MapControllerRoute(
            name: "default",
            pattern: "{controller=Projects}/{action=Index}/{id?}")
            .WithStaticAssets();

        app.Run();
    }
}
