// Program.cs
using System.Text;
using RutasDBUS.Components;
using RutasDBUS.Modelos.RedBus;
using RutasDBUS.Servicios.Caminata;
using RutasDBUS.Servicios.Historial;
using RutasDBUS.Servicios.Horarios;
using RutasDBUS.Servicios.Importacion;
using RutasDBUS.Servicios.Geocodificacion;
using RutasDBUS.Servicios.Planificacion;
using RutasDBUS.Servicios.RedBus;

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

var builder = WebApplication.CreateBuilder(args);

// =====================================================
// Razor Components (Blazor Server interactivo)
// =====================================================
builder.Services
    .AddRazorComponents()
    .AddInteractiveServerComponents();

// =====================================================
// Configuración tipada (appsettings.json)
// =====================================================
// En appsettings.json tienes:
// "RedBus": { "ArchivoDatos": "...", "DistanciaMaximaTransbordoMetros": 250 }
builder.Services.Configure<OpcionesRedBus>(
    builder.Configuration.GetSection("RedBus"));

// (Opcional) Si luego quieres opciones de Mapa/Elevación/Planificador, se hace igual:
// builder.Services.Configure<OpcionesMapa>(builder.Configuration.GetSection("Mapa"));
// builder.Services.Configure<OpcionesElevacion>(builder.Configuration.GetSection("Elevacion"));
// builder.Services.Configure<OpcionesPlanificadorRutas>(builder.Configuration.GetSection("PlanificadorRutas"));

// =====================================================
// Servicios propios
// =====================================================

// Servicio de red de autobuses (paradas, líneas, trayectos...)
builder.Services.AddSingleton<IServicioArchivoImportacionDbus, ServicioArchivoImportacionDbusMonitorizado>();
builder.Services.AddSingleton<CreadorRedTransporteDbus>();
builder.Services.AddSingleton<IRedBusServicio, RedBusServicio>();
builder.Services.AddSingleton<IHistorialRutasCompartidoService, ServicioHistorialRutasCompartido>();
builder.Services.AddSingleton<IGeocodificadorLocalServicio, GeocodificadorLocalServicio>();
builder.Services.AddSingleton<ServicioHorariosDbus>();
builder.Services.AddSingleton<CreadorIndiceTransitoDbus>();
builder.Services.AddSingleton<ServicioIndiceTransitoDbus>();
builder.Services.AddSingleton<BuscadorRutasTemporalesDbus>();
builder.Services.AddSingleton<IPlanificadorRutas, PlanificadorRutasServicio>();

// HttpClient genérico (lo usas en el Razor: @inject HttpClient Http)
builder.Services.AddHttpClient();

// Clientes HTTP tipados
builder.Services.AddHttpClient<IClienteOsrm, ClienteOsrm>();
builder.Services.AddHttpClient<IClienteValhalla, ClienteValhalla>();

var app = builder.Build();

// =====================================================
// Pipeline
// =====================================================
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();

app.MapRazorComponents<App>()
   .AddInteractiveServerRenderMode();

app.Run();

