using RutasDBUS.Modelos.RedBus;

namespace RutasDBUS.Servicios.RedBus;

/// <summary>
/// Define las operaciones sobre la red de autobuses.
/// </summary>
public interface IRedBusServicio
{
    /// <summary>Paradas cargadas en la red.</summary>
    IReadOnlyList<Parada> Paradas { get; }

    /// <summary>Trayectos cargados en la red.</summary>
    IReadOnlyDictionary<int, Trayecto> Trayectos { get; }

    /// <summary>Líneas de bus cargadas en la red.</summary>
    IReadOnlyList<LineaBus> Lineas { get; }

    /// <summary>
    /// Carga la red (paradas, trayectos, líneas) desde el fichero XML.
    /// </summary>
    Task CargarRedAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// Calcula la distancia aproximada en metros entre dos coordenadas.
    /// </summary>
    double CalcularDistanciaMetros(double lat1, double lon1, double lat2, double lon2);

    /// <summary>
    /// Devuelve la parada más cercana a las coordenadas indicadas.
    /// </summary>
    Parada? BuscarParadaMasCercana(double latitud, double longitud);

    /// <summary>
    /// Devuelve la parada más cercana dentro de un radio máximo. Si no hay ninguna dentro de ese radio, devuelve null.
    /// </summary>
    Parada? BuscarParadaCercanaEnRango(double latitud, double longitud, double maxDistMetros);

    /// <summary>
    /// Convierte un color ARGB (8 caracteres hex) al formato CSS "#RRGGBB".
    /// </summary>
    string ConvertirColorArgbACss(string argb);

    /// <summary>
    /// Busca una ruta de bus (una sola alternativa) entre dos paradas, devolviendo tramos y paradas de Transbordo.
    /// </summary>
    List<TramoBus>? BuscarRutaBus(
        string codigoParadaOrigen,
        string codigoParadaDestino,
        out List<string> codigosParadasTransbordo);

    /// <summary>
    /// Construye las polilíneas de los tramos de bus y calcula la distancia total recorrida.
    /// </summary>
    List<double[,]> ConstruirLineasBus(
        IReadOnlyList<TramoBus> tramos,
        out double distanciaTotalBus);

    /// <summary>
    /// Busca varias rutas alternativas de bus entre dos paradas.
    /// De momento, la implementación devuelve al menos la ruta "clásica" encontrada por <see cref="BuscarRutaBus"/>.
    /// </summary>
    IReadOnlyList<RutaBusAlternativa> BuscarRutasBusAlternativas(
        string codigoParadaOrigen,
        string codigoParadaDestino,
        int maxAlternativas = 3);


}
