#main_spotify_alexa
from fastapi import FastAPI, Request
from thefuzz import process
import spotipy
from spotipy.oauth2 import SpotifyOAuth
import json
import os
import random # <-- Nova importação para o sorteio

# Parametros de inicialização do FastAPI e do Spotipy
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" 
))

# Mapeamento dos IDs do Spotify por ordem de prioridade para tocar a música
meus_dispositivos = [
    "d84f46c6-e71f-455b-aa49-78fae13845cb_amzn_2", # 1. Todo lugar
    "a576741d-f4fc-4793-a3e4-60f85b9c766c_amzn_2", # 2. Master Suite
    "b0bec6b9-f56f-46f5-89ef-c0da31a458bd_amzn_1", # 3. Echo Spot Bedroom
    "d84f46c6-e71f-455b-aa49-78fae13845cb_amzn_4"  # 4. Speakers
]

# Mapeamento dos IDs da Alexa para os IDs do Spotify
mapa_dispositivos = {
    # Master Suite
    "amzn1.ask.device.AMA3XJDH5VGFPGUIG5DTNDNYL6XSVEQ7LFUXPQZJDXWSYPKD7XMI6MPUWXXXQ3UB7OJ4FA3X3KH3E4LMNB2PY54WZDL3R7YBP3RLXAM7CDLF67U7VP3ZLYDDGSNY2LLNMRLKKA6V3ZRKU23RNTLK3CCMX4WQY5RACSJLPXPGKQAD4UGO5Y2A5YWLJHOQUB5JZIGKC5IBXAT3IV4B": "a576741d-f4fc-4793-a3e4-60f85b9c766c_amzn_2",
    # Echo Spot Bedroom
    "amzn1.ask.device.AMARJWFKOQQEXHS3S3FYL5NKS2674UN4J6ECSL6SXZPBRSMHTNUKN4GPL7GYZQRJKGYYAE3BNRGVKRPCNCDB3MTTKXUS2EKFTUKZAGOE5NIOZOFOJV33AMIBLMFB6JUOPWS5YTUXGWZH2EGR3ROKQWCLMV5OWJW4C7K2LSCPW7D3D37WMETR6MJEPYX4JKUXZPFRQ5PNVITFUWKX": "b0bec6b9-f56f-46f5-89ef-c0da31a458bd_amzn_1"
}

# ==========================================
# 🎵 NOVA FUNÇÃO: Busca Inteligente
# ==========================================
def buscar_melhor_musica(texto, chaves):
    """
    Busca as músicas mais parecidas. Se houver empate na nota máxima, 
    sorteia uma das músicas empatadas para garantir variedade.
    """
    # Usamos extract em vez de extractOne para pegar o Top 10 de resultados
    resultados = process.extract(texto, chaves, limit=10)
    
    if not resultados:
        return None, 0
        
    # O thefuzz sempre retorna a lista ordenada da maior para a menor nota.
    # Então, a pontuação do primeiro item é garantidamente a nota máxima.
    nota_maxima = resultados[0][1]
    
    # Filtramos apenas os resultados que atingiram a nota máxima exata
    empates = [res for res in resultados if res[1] == nota_maxima]
    
    # Sorteia aleatoriamente um resultado dentro da lista de empates
    resultado_sorteado = random.choice(empates)
    
    # Retorna o nome da música e a pontuação
    return resultado_sorteado[0], resultado_sorteado[1]


# 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")
    idioma = dados.get("request", {}).get("locale", "pt-BR")
    
    print(f"\n========================================")
    print(f"🔔 TIPO: {tipo_requisicao} | 🗣️ IDIOMA: {idioma}")
    print(f"========================================")
    
    # 1. IGNORA ENCERRAMENTOS DE SESSÃO
    if tipo_requisicao == "SessionEndedRequest":
        return {}
        
    # 2. FRASES DE BOAS-VINDAS BILÍNGUES
    if tipo_requisicao == "LaunchRequest":
        if "en" in idioma:
            return resposta_alexa("Deejay ready. What do you want to hear?", False)
        else:
            return resposta_alexa("Vitrola pronta. O que você quer ouvir?", False)
            
    elif tipo_requisicao == "IntentRequest":
        intent = dados.get("request", {}).get("intent", {})
        slots = intent.get("slots", {})
        
        texto_alexa = ""
        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:
            if "en" in idioma:
                return resposta_alexa("Sorry, I didn't catch the song name.", False)
            else:
                return resposta_alexa("Desculpe, não entendi o nome da música.", False)

        correcoes = {
            "ai meu alô": "i'm alone",
            "im alone": "i'm alone",
            "club house": "cappella",
            "mood boost": "moonboots",
            "mumbut": "moonboots",
            "capela": "cappella"
        }
        
        for errado, certo in correcoes.items():
            if errado in texto_alexa:
                texto_alexa = texto_alexa.replace(errado, certo)
                
        if not os.path.exists(ARQUIVO_DADOS):
            if "en" in idioma:
                return resposta_alexa("The database was not found.")
            else:
                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())
        
        # ==========================================
        # 🔍 CHAMADA DA NOVA ROTINA DE BUSCA E SORTEIO
        # ==========================================
        melhor_resultado, pontuacao = buscar_melhor_musica(texto_alexa, chaves_busca)
        
        if melhor_resultado:

                # ==========================================
                # 🔍 BLOCO DE DEBUG: Raio-X do Spotify e Alexa
                # ==========================================
                alexa_device_id = dados.get("context", {}).get("System", {}).get("device", {}).get("deviceId")
                print("\n" + "="*40)
                print("🔍 [DEBUG] DIAGNÓSTICO DE ROTEAMENTO:")
                print(f"   -> ID da Alexa que ouviu: {alexa_device_id}")
                
                spotify_target_id = mapa_dispositivos.get(alexa_device_id)
                if spotify_target_id:
                    print(f"   -> Mapeado para o Spotify ID: {spotify_target_id}")
                else:
                    print("   -> ⚠️ ATENÇÃO: Esta Alexa não está no 'mapa_dispositivos'! Pulando Plano A...")

                print("\n   [Status da API do Spotify neste exato milissegundo]:")
                try:
                    dispositivos_spotify = sp.devices()
                    if dispositivos_spotify and 'devices' in dispositivos_spotify and len(dispositivos_spotify['devices']) > 0:
                        for dev in dispositivos_spotify['devices']:
                            status = "🟢 ATIVO" if dev.get('is_active') else "🔴 DORMINDO"
                            print(f"      - {status} | Nome: '{dev.get('name')}' | ID: {dev.get('id')}")
                    else:
                        print("      - A API retornou uma lista VAZIA (Tudo offline ou escondido).")
                except Exception as e:
                    print(f"      - Erro ao ler sp.devices(): {e}")
                print("="*40 + "\n")
                # ==========================================

            if pontuacao >= 80:
                track_uri = biblioteca_musical[melhor_resultado]
                print(f"==> ENCONTRADO: '{melhor_resultado}' | URI: {track_uri} | Score: {pontuacao}%")
                
                try:
                    alexa_device_id = dados.get("context", {}).get("System", {}).get("device", {}).get("deviceId")
                    print(f"\n[INFO] CAIXINHA QUE OUVIU O COMANDO: {alexa_device_id}")
                    
                    spotify_target_id = mapa_dispositivos.get(alexa_device_id)
                    
                    # PLANO A: CAIXINHA ESPECÍFICA
                    if spotify_target_id:
                        try:
                            print("Direcionando música para a caixinha específica do pedido...")
                            sp.start_playback(device_id=spotify_target_id, uris=[track_uri])
                            print(f"==> Sucesso! Tocando {melhor_resultado} no dispositivo: {spotify_target_id}")
                            if "en" in idioma:
                                return resposta_alexa(f"Playing {melhor_resultado}.")
                            else:
                                return resposta_alexa(f"Tocando {melhor_resultado}.")
                        except Exception as e:
                            print(f"Caixinha específica falhou. Indo para o plano B...")

                    # PLANO B: DISPOSITIVO ATIVO NO MOMENTO
                    try:
                        print("Tentando tocar no dispositivo ativo genérico...")
                        sp.start_playback(uris=[track_uri])
                        print(f"==> Sucesso! Tocando {melhor_resultado} no dispositivo: ativo")
                        if "en" in idioma:
                            return resposta_alexa(f"Playing {melhor_resultado}.")
                        else:
                            return resposta_alexa(f"Tocando {melhor_resultado}.")
                    except Exception as erro_ativo:
                        print(f"Nenhum dispositivo ativo. Acionando lista de resgate...")
                        
                        # PLANO C: TODOS OS DISPOSITIVOS DISPONÍVEIS
                        tocou_com_sucesso = False
                        for aparelho_id in meus_dispositivos:
                            try:
                                sp.start_playback(device_id=aparelho_id, uris=[track_uri])
                                tocou_com_sucesso = True
                                break 
                            except Exception as erro_local:
                                continue 
                                
                        if tocou_com_sucesso:
                            print(f"==> Sucesso! Tocando {melhor_resultado} no dispositivo: {aparelho_id}")
                            if "en" in idioma:
                                return resposta_alexa(f"Playing {melhor_resultado}.")
                            else:
                                return resposta_alexa(f"Tocando {melhor_resultado}.")
                        else:
                            if "en" in idioma:
                                return resposta_alexa("No device available at the moment.")
                            else:
                                return resposta_alexa("Nenhum dispositivo disponível no momento.")
                            
                except Exception as e:
                    print(f"ERRO GERAL DE PLAYBACK: {e}")
                    if "en" in idioma:
                        return resposta_alexa("Failed to communicate with Spotify.")
                    else: 
                        return resposta_alexa("Falha ao comunicar com o Spotify.")

            else:
                if "en" in idioma:
                    return resposta_alexa(f"I couldn't find the song {texto_alexa}.")
                else:
                    return resposta_alexa(f"Não encontrei a música {texto_alexa}.")
        else:
            if "en" in idioma:
                return resposta_alexa(f"The library is empty.")
            else:
                return resposta_alexa("A biblioteca está vazia.")
            
    if "en" in idioma:
        return resposta_alexa("Session ended.")
    else:
        return resposta_alexa("Sessão encerrada.")