#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()

# Puxa as credenciais diretamente do ambiente do Linux
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")

# Trava de segurança para avisar se o Linux não injetar as chaves
if not SPOTIPY_CLIENT_ID or not SPOTIPY_CLIENT_SECRET:
    print("[!] ALERTA: Credenciais do Spotify não encontradas no ambiente!")

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" 
))

@app.post("/alexa")
async def alexa_endpoint(request: Request):
    dados = await request.json()
    texto_alexa = dados.get("texto", "").lower()
    
    print(f"\n[COMANDO RECEBIDO] ==> ALEXA OUVIU: {texto_alexa}")
    
    if not os.path.exists(ARQUIVO_DADOS):
        return {"status": "erro", "mensagem": "Banco de dados não 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 >= 70:
            track_uri = biblioteca_musical[melhor_resultado]
            print(f"==> ENCONTRADO: '{melhor_resultado}' | URI: {track_uri} | Score: {pontuacao}%")
            
            try:
                sp.start_playback(uris=[track_uri])
                return {"status": "sucesso", "musica": melhor_resultado}
            except Exception as e:
                print(f"ERRO DE PLAYBACK: {e}")
                return {"status": "erro", "mensagem": "Falha ao tocar no Spotify."}
        else:
            return {"status": "falha", "mensagem": "Música não encontrada."}
    else:
        return {"status": "falha", "mensagem": "Biblioteca vazia."}