namespace RutasDBUS.Modelos.RedBus;

/// <summary>
/// Información precalculada de una variante con la secuencia de paradas.
/// </summary>
public class InfoVariante
{
    /// <summary>Línea a la que pertenece la variante.</summary>
    public LineaBus Linea { get; set; } = default!;

    /// <summary>Sentido dentro del itinerario.</summary>
    public Sentido Sentido { get; set; } = default!;

    /// <summary>Variante concreta de la línea.</summary>
    public Variante Variante { get; set; } = default!;

    public int CodigoItinerario { get; set; }


    /// <summary>
    /// Lista ordenada de códigos de parada que recorre la variante.
    /// </summary>
    public List<string> CodigosParadas { get; set; } = new();
}

/// <summary>
/// Indica en qué variante y en qué posición aparece una parada.
/// </summary>
public class AparicionParada
{
    /// <summary>Variante en la que aparece la parada.</summary>
    public InfoVariante Variante { get; set; } = default!;

    /// <summary>Índice de la parada dentro de <see cref="InfoVariante.CodigosParadas"/>.</summary>
    public int IndiceParada { get; set; }
}


public class TramoBus
{
    public InfoVariante Variante { get; set; } = default!;

    /// <summary>
    /// Índice de parada inicial (incluida) dentro de la secuencia de paradas.
    /// </summary>
    public int IndiceInicio { get; set; }

    /// <summary>
    /// Índice de parada final (incluida) dentro de la secuencia de paradas.
    /// OJO: al construir geometría se recorren trayectos: i = IndiceInicio .. IndiceFin-1.
    /// </summary>
    public int IndiceFin { get; set; }

    public string CodigoParadaInicio =>
        Variante.CodigosParadas[Math.Clamp(IndiceInicio, 0, Variante.CodigosParadas.Count - 1)];

    public string CodigoParadaFin =>
        Variante.CodigosParadas[Math.Clamp(IndiceFin, 0, Variante.CodigosParadas.Count - 1)];

    public bool EsValido =>
        IndiceInicio >= 0 &&
        IndiceFin >= 0 &&
        IndiceInicio < Variante.CodigosParadas.Count &&
        IndiceFin < Variante.CodigosParadas.Count &&
        IndiceInicio < IndiceFin;
}

