#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 = [
    "0034429b-fba7-4b82-a5c0-ea25e3114461_amzn_1", # 1. Alexa Kitchen Echo Show
    "46d2d79a-3f35-4c57-8438-0f642b1a3dc1_amzn_2", # 2. Todo lugar
    "aa24d0ea-b345-4187-b7f8-36d5bac83875_amzn_2", # 3. Master Suite
    "aa24d0ea-b345-4187-b7f8-36d5bac83875_amzn_1", # 4. Master Suite Echo Dot
    "215571e7-945e-4926-99ea-a2a000420c37_amzn_1", # 5. Echo Spot Bedroom
    "46d2d79a-3f35-4c57-8438-0f642b1a3dc1_amzn_1", # 6. Basement Office Echo Pop
    "46d2d79a-3f35-4c57-8438-0f642b1a3dc1_amzn_4", # 7. Speakers
    "46d2d79a-3f35-4c57-8438-0f642b1a3dc1_amzn_3"  # 8. Wake up time
]
# Mapeamento dos IDs da Alexa para os IDs do Spotify
mapa_dispositivos = {
    # ==========================================
    # 🛏️ MASTER SUITE
    # ==========================================
    "amzn1.ask.device.AMA3XJDH5VGFPGUIG5DTNDNYL6XSVEQ7LFUXPQZJDXWSYPKD7XMI6MPUWXXXQ3UB7OJ4FA3X3KH3E4LMNB2PY54WZDL3R7YBP3RLXAM7CDLF67U7VP3ZLYDDGSNY2LLNMRLKKA6V3ZRKU23RNTLK3CCMX4WQY5RACSJLPXPGKQAD4UGO5Y2A5YWLJHOQUB5JZIGKC5IBXAT3IV4B": "aa24d0ea-b345-4187-b7f8-36d5bac83875_amzn_2",
    
    # ==========================================
    # 🌙 QUARTO (Echo Spot Bedroom)
    # ==========================================
    "amzn1.ask.device.AMARJWFKOQQEXHS3S3FYL5NKS2674UN4J6ECSL6SXZPBRSMHTNUKN4GPL7GYZQRJKGYYAE3BNRGVKRPCNCDB3MTTKXUS2EKFTUKZAGOE5NIOZOFOJV33AMIBLMFB6JUOPWS5YTUXGWZH2EGR3ROKQWCLMV5OWJW4C7K2LSCPW7D3D37WMETR6MJEPYX4JKUXZPFRQ5PNVITFUWKX": "215571e7-945e-4926-99ea-a2a000420c37_amzn_1",

    # ==========================================
    # 🍳 COZINHA (Alexa Kitchen Echo Show)
    # ==========================================
    #"amzn1.ask.device.AMA6UQVOGPYC7JNBASESWFQNE7GEK3ZLTVMD2BKB4FOXUDLHZ53N6YV34M5LA5FTL36HBEGCYWE4MZLRLYRCHSSM5BCSHELPBLAUAGMIOKPRREENL5AWU556PCRM7M6HDNAJHYEQB6BUVWJMGFMCL4GV7TOBFUQ3ALZ6TCEB34A6RTWVUT6HYQB2OAMJOI6LLXNF25AAXWJLSQA": "0034429b-fba7-4b82-a5c0-ea25e3114461_amzn_1",

    # ==========================================
    # Echo Spot Suite Bathroom
    # ==========================================
    "amzn1.ask.device.AMA44JYVW62DNE6XPK4HN3DGN63RBCPZ3EUSSVS4M7BYHU7A3EU22KT5NRKWPHWW64JZA5AHVIG5GL5D2674R5WMM5QFJLB2UQLLKQEUZJJ7LQLY7FBDQT54CYZIVJKWPN2ZIF67HK2W37SSSIKTXX3BNEJ6QOWW5XJ3ARNGHC4XHYM57D5SQVCCSFCADJ2WRY72VR23ZHA2XF5R": "328df3a2-68eb-465f-a5fd-bc95c0616ab6_amzn_1",
    
    # ==========================================
    # Basement Office Echo Pop
    # ==========================================
    "amzn1.ask.device.AMAWOFSPMEOPUY35RY4R6IFGJEPCFOX7CJ72IMKT6HOPELWD432FGJVX6NASDBXKJ6HDCNPXOXB6ZKSR5FUM5ZFYKJBXV6SJRAYDQP65PTDBJCR5EOZN5M4TN7FWB5XKCZHVWLE5OE3D5CW4BYYXLIQZ4SMNAHZTHUMD4DM66QOSVDJYAJED5DNF6GRPS6NNEKRUFQZMWVXJCXI6": "46d2d79a-3f35-4c57-8438-0f642b1a3dc1_amzn_1",

    # ==========================================
    # Echo dot Bathroom
    # ==========================================
    "amzn1.ask.device.AMAYXZ7DSJO2CZ5IZ6HSNUQLKTWLGS4YVDLVYUJJVG3NP2PPBYLHB2BYV27J5MEOJPNMQO3AH4I3G6WPYPAACWXKNLGF4WFQ7QLHAUBSP2JSI5FUFJS6IH6KMSWA5MTBADPLH3USLGBACN77EB4AOVSV2XAWPHC57ZGYHVUQO2B7FC7KPQQZ7WRJXBHEPFMASDN67L4LE4ZZHVTG": "5bbac0ce-0995-40d4-9137-a951e70c6642_amzn_1"
}

# ==========================================
# 🎵 NOVA FUNÇÃO: Busca Inteligente com Sorteio
# ==========================================
def buscar_melhor_musica(texto_busca, chaves_disponiveis):
    """
    Realiza a busca fuzzy e, em caso de empate na nota máxima, 
    sorteia aleatoriamente um dos resultados para garantir variedade.
    """
    resultados = process.extract(texto_busca, chaves_disponiveis, limit=15)
    
    if not resultados:
        return None, 0
        
    nota_maxima = resultados[0][1]
    
    # Filtra apenas as faixas que atingiram essa mesma nota máxima
    empates = [res for res in resultados if res[1] == nota_maxima]
    
    # Sorteia aleatoriamente um resultado dentro dos que empataram
    resultado_sorteado = random.choice(empates)
    
    # ====== NOVO BLOCO DE DEBUG PARA O TERMINAL ======
    if len(empates) > 1:
        print(f"\n🎲 [SORTEIO] {len(empates)} músicas empataram com a nota máxima ({nota_maxima}%):")
        for emp in empates:
            print(f"   - {emp[0]}")
        print(f"   👉 A sorteada foi: '{resultado_sorteado[0]}'")
    else:
        print(f"\n🎯 [BUSCA DIRETA] Sem empates. Música líder isolada com {nota_maxima}%: '{resultado_sorteado[0]}'")
    # =================================================
    
    # Retorna a string da música (índice 0) e o score (índice 1)
    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.")