from avio import Avió
from agencia import Agencia
from threading import Semaphore

import sys


def estadisAgencies(avió, agencies):
    #
    # Cada agència manté un registre de les reserves fetes.
    # Estudiem si hi ha hagut "overbooking". Cada reserva
    # ha de tenir un seient únic.
    #
    freq = {}
    for ag in agencies:
        for r in ag.reserva.values():
            freq[r] = freq.get(r, 0) + 1
    if freq == {}:
        print("cap reserva feta. Avió tot ocupat d'abans")

    reserves = 0
    print("Seients amb més d'una reserva:")
    for f in sorted(freq):
        if freq[f] != 1:
            print(f, freq[f])
        else:
            reserves += freq[f]
    if reserves == len(freq):
        print('Places reservades sense "overbooking"')
    else:
        print(reserves, 'places OK de', len(freq))
    if reserves == avió.places():
        print("Tot l'avió ocupat")
    print("Reserves per agència")
    for ag in agencies:
        print('{:>6s}: {:6d}'.format(ag.nomAg,len(ag.reserva)))
    print("Clients per ordre temporal de reserva:")
    fmt = '{:>6s}: {:24s} {:s}'
    print(fmt.format('seient','client', 'data'))
    for s, reserva in sorted(((s, avió[s]) for s in avió),
                             key= lambda x: x[1][1]):
        client, data = reserva
        print(fmt.format(s, client, data))

        


def registreReserves(idAvio='Boeing714', nFiles=30, nAgencies=10):
    avió = Avió(idAvio, nFiles)

    nPlaces = avió.places()
    agencies = [Agencia(f'age{i:03d}',
                        avió,
                        map(str, range(i*nPlaces , i*nPlaces + nPlaces))) for i in range(nAgencies)]

    for ag in agencies:
        ag.start()

    for ag in agencies:
        ag.join()
    estadisAgencies(avió, agencies)


if __name__=='__main__':
    if len(sys.argv) == 1:
        registreReserves()
    elif len(sys.argv) == 2:
        registreReserves(sys.argv[1])
    elif len(sys.argv) == 3:
        registreReserves(sys.argv[1], int(sys.argv[2]))
    elif len(sys.argv) == 4:
        registreReserves(sys.argv[1], int(sys.argv[2]), int(sys.argv[3]))
    else:
        print(f"Ús: {argv[0]} [nomAvió] [nombre de files] [nombre d'agències]")

