import yaml


pitch_class = {0: "C", 1: "C♯", 2: "D", 3: "D♯", 4: "E", 5: "F", 6: "F♯", 7: "G", 8: "G♯", 9: "A", 10: "A♯", 11: "B"}


def get_cred(path="credentials.yaml"):
    with open(path, 'r') as f:
        try:
            y = yaml.load(f)
            return y['id'], y['secret']
        except Exception as e:
            print(e)
            raise e

def get_upl_tids(sp, user, pid):
    tids = []
    off = 0
    while True:
        pdata = sp.user_playlist_tracks(user, pid, limit=100, offset=off)
        if not pdata['items']:
            break
        tids.extend([t['track']['id'] for t in pdata['items']])
        off += 100
    return tids

def get_lst_ft(sp, tids):
    """Retrieve track features for a list of track ids"""
    fts = []
    off = 0
    while True:
        tid_slice = tids[off:off + 100]
        if not tid_slice:
            break
        fts.extend(sp.audio_features(tid_slice))
        off += 100
    return fts


def get_lst_an(sp, tids):
    """Retrieve track analysis for a list of track ids"""
    ans = []
    for t in tids:
        print(t)
        an = sp.audio_analysis(t)
        an['id'] = t
        ans.append(an)
    return ans


def mean_timbre(analysis):
    mean = init_dict(12, lambda x: f"t{x}", 0)
    dur = analysis['track']['duration']
    for s in analysis['segments']:
        tim = s['timbre']
        for i in range(0, 12):
            mean[f"t{i}"] += tim[i] * (s['duration'] / dur)
    return mean


def mean_pitch(analysis):
    mean = init_dict(12, lambda x: pitch_class[x], 0)
    dur = analysis['track']['duration']
    for s in analysis['segments']:
        pit = s['pitches']
        for i in range(0, 12):
            mean[pitch_class[i]] += pit[i] * (s['duration'] / dur)
    return mean


def init_dict(leng, f, init_val):
    dic = {}
    for i in range(leng):
        dic[f(i)] = init_val
    return dic