#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
                
        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())
        resultado = process.extractOne(texto_alexa, chaves_busca)
        
        if resultado:
            melhor_resultado = resultado[0]
            pontuacao = resultado[1]
            
            if pontuacao >= 55:
                track_uri = biblioteca_musical[melhor_resultado]
                print(f"==> ENCONTRADO: '{melhor_resultado}' | URI: {track_uri} | Score: {pontuacao}%")
                
                try:
                    sp.start_playback(uris=[track_uri])
                    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.")