from setton.tones import a, bfl, c, d, e, f, g, sil, play
from utils import keyboard_listener, valida_resposta, trata_acento
from matematica import limite
from random import choice
from os import listdir, path
from Pygame import mixer, error


def coffin_dance():

    def agudo():
        g()
        g(5, 250)
        bfl(6, 250)
        a(6, 250)
        bfl(6, 250)
        a(6, 250)
        bfl(6, 250)

    def prep():
        g()
        g(5, 250)
        d(6, 250)
        c(6)
        bfl()
        a()
        a(5, 250)
        a(5, 250)
        c(6)
        bfl(5, 250)
        a(5, 250)

    def x4():
        notas = [
            (bfl, 5, 250),
            (d, 6, 250),
            (c, 6, 250),
            (f, 6, 250),
            (g, 6, 250),
            (g, 6, 250),
            (g, 6, 250),
        ]
        for tup in notas:
            nota, oitava, mili = tup
            for _ in range(4):
                nota(oitava, mili)

    def fall():
        c(6, 250)
        bfl(5, 250)
        a(5, 250)
        f(5, 250)

    def geral():
        prep()
        agudo()
        agudo()

    fall()

    geral()
    geral()

    x4()
    fall()

    geral()


def toca_mp3(caminho):
    mixer.init()
    mixer.music.load(caminho)
    mixer.music.play()


def toca_musicas_mp3():
    mixer.init()

    caminho = r'C:\Users\rasea\OneDrive\Backup\Musicas\mp3'

    def musica():
        mus = input("Digite o nome da música para tocar: ").split('.')[0].strip().title()
        mus = trata_acento(mus)[0]

        if mus == 'Random':
            options = listdir(caminho)
            options.remove('Adicionar')
            mus = choice(options)[:-4]
        try:
            mixer.music.load(path.join(caminho, mus + '.mp3'))
        except error:
            print(f"A musica {mus} não foi encontrada.")
            adic = valida_resposta("Deseja adicioná-la à lista de desejos? [S/N] ", ["S", "N"])
            if adic == "S":
                with open('C:\\Users\\rasea\\OneDrive\\Backup\\Musicas\\mp3\\Adicionar.txt', mode='r+') as adic:
                    if mus not in adic.read():
                        adic.write(mus+'\n')
        else:
            mixer.music.play()
            keyboard_listener({'+': lambda: mixer.music.set_volume(limite(1, 0, mixer.music.get_volume() + 0.05)),
                               '-': lambda: mixer.music.set_volume(limite(1, 0, mixer.music.get_volume() - 0.05)),
                               '\n': mixer.music.stop})
            input("Para parar, aperte Enter.")
            while mixer.music.get_busy():
                pass

    def alterar_volume():
        vol = int(input(f"Volume atual: {int(mixer.music.get_volume()*100)}. Alterar volume para: [0-100] "))/100
        mixer.music.set_volume(vol)

    def lista(comeco):
        for m in listdir(caminho):
            if m.startswith(comeco) and m.endswith('.Mp3'):
                print(m[:-4])

    while True:
        acao = valida_resposta("O que você deseja fazer? (V) Volume, (M) Música, (L) Listar Músicas ", ["V", "M", "L"])
        if acao == 'V':
            alterar_volume()
        elif acao == "M":
            musica()
        else:
            filtro = input("Somente músicas que começam com: (Deixe em branco para listar todas as músicas) ").title()
            lista(filtro)


def do_re_mi_fa():
    refrao = [c, d, e, f, sil, f, f, sil]
    play(*refrao, c, d, c, d, sil, d, d, sil, c, g, f, e, sil, e, e, sil, *refrao)
