import os
import time
import tinytag

def parsi_kestotiedot(kokoelma):
    """
    Parsii jokaisen kokoelma-listassa olevan albumin
    kokonaiskeston siinä olevien kappaleiden
    kestojen summasta. Kesto muutetaan aikamuotoon HH:MM:SS.
    Lista kestoista poistetaan sanakirjasta.
    """

    for levy in kokoelma:
        levy["kesto"] = time.strftime("%H:%M:%S", time.gmtime(sum(levy["kestot"])))
        levy["kpl_n"] = len(levy["kestot"])
        levy.pop("kestot")

def lue_kansio(kansio, kokoelma):
    """
    Käy rekursiivisesti läpi hakemistopuun ja lukee löytyneiden
    musiikkitiedostojen tiedot. Lukeminen tapahtuu lue_tiedot-
    funktiolla, joka myös lisää löytyneiden kappaleiden tiedot
    kokoelma-listaan.
    """

    print("Avataan kansio:", kansio)
    sisalto = os.listdir(kansio)
    for nimi in sisalto:
        polku = os.path.join(kansio, nimi)
        if os.path.isdir(polku):
            lue_kansio(polku, kokoelma)
        else:
            try:
                lue_tiedot(polku, kokoelma)
            except tinytag.TinyTagException:
                print("Ohitetaan", nimi)

def lue_tiedot(tiedosto, kokoelma):
    """
    Lukee musiikkitiedoston metadatan ja poimii sieltä
    artistin ja albumin nimen sekä julkaisuvuoden. Mikäli
    albumi on jo kokoelma-listassa, musiikkitiedoston kesto
    lisätään jo löytyneiden kappaleiden kestojen listaan.
    Jos albumia ei ole kokoelmassa, se lisätään sanakirjana
    kokoelma-listaan, ja kestot-lista alustetaan siten, että
    kappaleen kesto tulee ensimmäiseksi alkioksi.
    """

    tiedot = tinytag.TinyTag.get(tiedosto)
    albumi = tiedot.album
    artisti = tiedot.artist
    vuosi = tiedot.year
    kesto = tiedot.duration
    for levy in kokoelma:
        if levy["artisti"].lower() == artisti.lower() and levy["albumi"].lower() == albumi.lower():
            levy["kestot"].append(kesto)
            break
    else:
        kokoelma.append({
            "artisti": artisti,
            "albumi": albumi,
            "kestot": [kesto],
            "julkaisuvuosi": vuosi
        })

def lue_kokoelma(kansio):
    """
    Rakentaa levykokoelman käyttäen lue_kansio- ja
    parsi_kestotiedot-funktioita. Rakennettu kokoelma
    palautetaan listana, joka sisältää sanakirjoja.
    """

    kokoelma = []
    lue_kansio(kansio, kokoelma)
    parsi_kestotiedot(kokoelma)
    return kokoelma
