from typing import List, Union
from pyrmv.classes.Stop import Stop
from pyrmv.enums.lang import Language
from pyrmv.raw.stop_by_name import stop_by_name as raw_stop_by_name
from pyrmv.utility.find_exception import find_exception

try:
    from typing import Literal
except ImportError:
    from typing_extensions import Literal

def stop_by_id(
    
        access_id: str,
        query: str,
        lang: Literal[Language.DE, Language.DA, Language.EN, Language.ES, Language.FR, Language.HU, Language.IT, Language.NL, Language.NO, Language.PL, Language.SV, Language.TR] = Language.EN,
    ) -> Union[Stop, None]:
    """Method can be used to get Stop object whilst only having id available.

    ### Args:
        * access_id (`str`): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
        * query (`str`): Search for that token.
        * lang (`Literal[Language.DE, Language.DA, Language.EN, Language.ES, Language.FR, Language.HU, Language.IT, Language.NL, Language.NO, Language.PL, Language.SV, Language.TR]`, **optional**): The language of response. Defaults to `Language.EN`.
    
    ### Returns:
        * Stop: Instance of Stop object or None if not found.
    """    

    stops_raw = raw_stop_by_name(
        accessId=access_id,
        inputString=query,
        lang=lang.code,
        maxNo=1
    )

    find_exception(stops_raw)

    if len(stops_raw["stopLocationOrCoordLocation"]) > 0:
        stop = stops_raw["stopLocationOrCoordLocation"][0]

        if "StopLocation" in stop:
            return Stop(stop["StopLocation"])
        elif "CoordLocation" in stop:
            return Stop(stop["CoordLocation"])
        else:
            return None
    else:
        return 0