#main_spotify_alexa
from fastapi import FastAPI, Request
from thefuzz import process
import spotipy
from spotipy.oauth2 import SpotifyOAuth
import json
import os

app = FastAPI()

SPOTIPY_CLIENT_ID = os.environ.get("SPOTIPY_CLIENT_ID")
SPOTIPY_CLIENT_SECRET = os.environ.get("SPOTIPY_CLIENT_SECRET")
SPOTIPY_REDIRECT_URI = os.environ.get("SPOTIPY_REDIRECT_URI")
ARQUIVO_DADOS = os.path.expanduser("~/spotify_biblioteca.json")

sp = spotipy.Spotify(auth_manager=SpotifyOAuth(
    client_id=SPOTIPY_CLIENT_ID,
    client_secret=SPOTIPY_CLIENT_SECRET,
    redirect_uri=SPOTIPY_REDIRECT_URI,
    scope="user-modify-playback-state user-read-playback-state",
    cache_path="spotify_token.txt" 
))

# Função para montar a resposta no padrão exigido pela Alexa
def resposta_alexa(texto, encerrar_sessao=True):
    return {
        "version": "1.0",
        "response": {
            "outputSpeech": {
                "type": "PlainText",
                "text": texto
            },
            "shouldEndSession": encerrar_sessao
        }
    }

@app.post("/alexa")
async def alexa_endpoint(request: Request):
    dados = await request.json()
    
    tipo_requisicao = dados.get("request", {}).get("type")
    
    # Se o usuário apenas abrir a skill: "Alexa, abra minha vitrola"
    if tipo_requisicao == "LaunchRequest":
        return resposta_alexa("Vitrola pronta. O que você quer ouvir?", False)
        
    # Se o usuário pedir a música: "Alexa, peça para minha vitrola tocar moonboots"
    elif tipo_requisicao == "IntentRequest":
        intent = dados.get("request", {}).get("intent", {})
        slots = intent.get("slots", {})
        
        texto_alexa = ""
        # Procura qual slot a Alexa preencheu com a sua voz
        for slot_name, slot_data in slots.items():
            if "value" in slot_data:
                texto_alexa = slot_data["value"].lower()
                break
        
        # Dicionário de correções para a surdez da Alexa
        correcoes_alexa = {
            # Correções de artistas no Spotify
            "club house": "cappella",
            
            # Correções de audição da Alexa
            "mood boost": "moonboots",
            "mumbut": "moonboots",
            "capela": "cappella",
        }
        
        # Se a Alexa falar a palavra errada, o Python corrige antes de buscar
        for errado, certo in correcoes_alexa.items():
            if errado in texto_alexa:
                texto_alexa = texto_alexa.replace(errado, certo)

        print(f"\n[COMANDO RECEBIDO] ==> ALEXA OUVIU: '{texto_alexa}'")
        
        if not texto_alexa:
            return resposta_alexa("Desculpe, não entendi o nome da música.")

        if not os.path.exists(ARQUIVO_DADOS):
            return resposta_alexa("O banco de dados não foi encontrado.")
            
        with open(ARQUIVO_DADOS, 'r', encoding='utf-8') as f:
            biblioteca_musical = json.load(f)
            
        # chaves_busca = list(biblioteca_musical.keys())
        # Substitui os códigos HTML por apóstrofos reais em toda a biblioteca
        chaves_busca = [chave.replace("&apos;", "'") for chave in biblioteca_musical.keys()]
        resultado = process.extractOne(texto_alexa, chaves_busca)
        
        if resultado:
            melhor_resultado = resultado[0]
            pontuacao = resultado[1]
            
            if pontuacao >= 60:
                track_uri = biblioteca_musical[melhor_resultado]
                print(f"==> ENCONTRADO: '{melhor_resultado}' | URI: {track_uri} | Score: {pontuacao}%")
                
                try:
                    #sp.start_playback(uris=[track_uri])
                    try:
                    # Array de IDs com ordem de prioridade de reprodução
                    meus_dispositivos = [
                        "b0bec6b9-f56f-46f5-89ef-c0da31a458bd_amzn_1", # 1. Echo Spot Bedroom
                        "d84f46c6-e71f-455b-aa49-78fae13845cb_amzn_2", # 2. Todo lugar
                        "a576741d-f4fc-4793-a3e4-60f85b9c766c_amzn_2", # 3. Master Suite
                        "d84f46c6-e71f-455b-aa49-78fae13845cb_amzn_4"  # 4. Speakers
                    ]
                    
                    tocou_com_sucesso = False
                    
                    # O script testa um por um
                    for aparelho_id in meus_dispositivos:
                        try:
                            sp.start_playback(device_id=aparelho_id, uris=[track_uri])
                            tocou_com_sucesso = True
                            print(f"==> Sucesso! Tocando no dispositivo: {aparelho_id}")
                            break # Se deu certo, interrompe o loop e não tenta os outros
                        except Exception as erro_local:
                            print(f"Aparelho {aparelho_id} indisponível. Tentando o próximo...")
                            continue # Vai para o próximo ID da lista
                            
                    if tocou_com_sucesso:
                        return resposta_alexa(f"Tocando {melhor_resultado}.")
                    else:
                        return resposta_alexa("Nenhum dispositivo disponível no momento.")
                        
                except Exception as e:
                    print(f"ERRO GERAL DE PLAYBACK: {e}")
                    return resposta_alexa("Falha ao comunicar com o Spotify.")
                    return resposta_alexa(f"Tocando {melhor_resultado}.")
                except Exception as e:
                    print(f"ERRO DE PLAYBACK: {e}")
                    return resposta_alexa("Falha ao tocar no Spotify. Verifique se o dispositivo está ativo.")
            else:
                return resposta_alexa(f"Não encontrei a música {texto_alexa}.")
        else:
            return resposta_alexa("A biblioteca está vazia.")
            
    # Para encerramentos de sessão ou erros
    return resposta_alexa("Sessão encerrada.")