#!/usr/bin/env python3

import metrovalencia
import argparse

def show_station(station):
    print('{} ({})'.format(station['name'].lower().capitalize(), station['id']))
    print('  Lines: {}'.format(station['lines']))
    print('  Location: {}'.format(station['location']))

def show_arrival(arrival):
    seconds = int(arrival['arrival_time'] % 60)
    minutes = int(arrival['arrival_time'] / 60)

    print('    {} - {} - {:02d}:{:02d}'.format(arrival['line'], arrival['destination'], minutes, seconds))

def show_plan(path):
    for index, step in enumerate(path[:-1]):
        n_lines = len(step['lines'])
        if n_lines == 1:
            print('Take line {} in {} until {}'.format(step['lines'][0], step['station']['name'], path[index+1]['station']['name']))
        else:
            print('Take any of the lines {} in {} until {}'.format(', '.join([str(x) for x in step['lines']]), step['station']['name'], path[index+1]['station']['name']))

def show_plan_coordinates(path, initial_coordinates, final_coordinates):
    print('Walk from {} to station {} in {}'.format(initial_coordinates, path[0]['station']['name'], path[0]['station']['location']))
    show_plan(path)
    print('Walk from station {} in {} to {}'.format(path[-1]['station']['name'], path[-1]['station']['location'], final_coordinates))

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        prog='MetroValencia',
        description='This is a cli for using MetroValencia python API',
    )

    parser.add_argument('-l', required=False, action='store_true', help='List stations')
    parser.add_argument('-c', required=False, metavar='latitude,longitude', help='Show closest station to coordinates in format latitude,longitude')
    parser.add_argument('-t', required=False, metavar='stationid', type=int, help='Id of the station to retrieve times')
    parser.add_argument('-p', required=False, metavar='stationid,stationid', help='Specify the transit station IDs for planning the route. Provide a comma-separated list of two station IDs, e.g., -p 123,456.')
    arguments = parser.parse_args()
    
    n_args = sum([1 if x else 0 for x in vars(arguments).values()])
    if (n_args < 1):
        parser.error("Argument required. Use -h to show help.")
    if n_args > 1:
        parser.error("Use only one argument at time")
        
    if(arguments.l):
        for x in metrovalencia.get_stations():
            show_station(x)
            print('')
    if(arguments.c):
        coordinates = [float(x) for x in arguments.c.split(',')]
        assert(len(coordinates) == 2)
        closest_station = metrovalencia.get_closest_stations(coordinates, n=1)
        show_station(closest_station[0])
    if(arguments.t):
        stationid = arguments.t
        stations = metrovalencia.get_stations(id_indexed=True)

        if stationid not in stations.keys():
            parser.error('Invalid stationid.')
        station = stations[stationid]

        show_station(station)
        print('  Upcoming trains:')
        [show_arrival(x) for x in metrovalencia.get_arrivals(stationid)]
    if(arguments.p):
        stationid1, stationid2 = [int(x) for x in arguments.p.split(',')]
        plan = metrovalencia.get_plan(stationid1, stationid2)
        show_plan(plan)
    