using RutasDBUS.Modelos.RedBus;

namespace RutasDBUS.Modelos.Planificacion;

public sealed class ParadaCandidata
{
    public Parada Parada { get; set; } = default!;
    public double DistanciaEuclidea { get; set; }
    public double DistanciaAPie { get; set; }
    public double TiempoAPie { get; set; }
}




public sealed class ParametrosPlanificadorRuta
{
    // velocidades
    public double VelocidadPieKmH { get; set; } = 3.6;
    public double VelocidadBusKmH { get; set; } = 16.0;

    // penalizaciones
    public int MinutosPorTransbordo { get; set; } = 5;
    public int MargenTransbordoSegundos { get; set; } = 120;
    public int SegundosPorParadaBus { get; set; } = 30;
    public double FactorPenalizacionDistanciaPie { get; set; } = 1.6;
    public double ParametroPenalizacionDistanciaPieMetros { get; set; } = 100.0;
    public double PesoTransbordoRankingMinutos { get; set; } = 4.0;
    public double FactorEquilibradoAndarBus { get; set; } = 12.0;

    // selección candidatas
    public int RadioParadasCandidatasMetros { get; set; } = 1200;
    public int MaxParadasCandidatasPorLado { get; set; } = 12;
    public bool UsarOsrmParaRanking { get; set; } = false;

    // filtro itinerarios
    public bool ActivarRangoLineas { get; set; } = false;
    public int LineaMin { get; set; } = 1;
    public int LineaMax { get; set; } = 999;
    public List<int> LineasPermitidas { get; set; } = new();
    public bool ActivarRangoItinerarios { get; set; } = true;
    public int ItinerarioMin { get; set; } = 1;
    public int ItinerarioMax { get; set; } = 80;

    // filtro de transbordos
    public bool ActivarRangoTransbordos { get; set; } = true;
    public int MinTransbordosPermitidos { get; set; } = 0;
    public int MaxTransbordosPermitidos { get; set; } = 3;

    // límites exploración
    public int MaxParesEvaluados { get; set; } = 280;
    public int MaxAlternativasBusPorPar { get; set; } = 4;

    // planificación temporal
    public bool UsarHorariosReales { get; set; } = true;
    public DateOnly? FechaSalida { get; set; }
    public TimeOnly? HoraSalida { get; set; }
    public bool DescartarAlternativasSinHorario { get; set; } = false;

    // filtros de espera
    public int MaxEsperaInicialMinutos { get; set; } = 90;
    public int MaxEsperaTransbordoMinutos { get; set; } = 60;
    public int MaxEsperaTotalMinutos { get; set; } = 120;

    // preferencia UI (null mantiene el criterio equilibrado por defecto)
    public string? PreferenciaEtiquetaRuta { get; set; } = null;
}

public sealed class ResultadoPlanificadorRuta
{
    public bool Ok { get; set; }
    public string Mensaje { get; set; } = "";
    public List<AlternativaRuta> Alternativas { get; set; } = new();
    public int IndicePreferido { get; set; } = 0;
}
