import os
import time
from flask import Flask, request
from openai import OpenAI
from elevenlabs.client import ElevenLabs
from elevenlabs import save
from signalwire.voice_response import VoiceResponse
from dotenv import load_dotenv

# 1. Cargar variables de entorno y configurar App
load_dotenv()
app = Flask(__name__)

# 2. Configuración de Clientes
ai_client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
voice_client = ElevenLabs(api_key=os.getenv('ELEVEN_API_KEY'))
VOICE_ID = 'Xb7hH8MSUJpSbSDYk0k2'  # Alice

def get_reservas():
    """Lee el archivo de texto de la carpeta reserva"""
    ruta_txt = "/var/www/html/reserva/reservas_registradas.txt"
    try:
        if os.path.exists(ruta_txt):
            with open(ruta_txt, "r") as f:
                contenido = f.read()
                return contenido if contenido.strip() else "No hay reservas anotadas."
        return "El archivo de reservas no existe."
    except Exception as e:
        return f"Error leyendo reservas: {e}"

@app.route("/voice", methods=['GET', 'POST'])
def initial_call():
    """Punto de entrada de la llamada"""
    print("--- Nueva llamada: Alice con memoria de reservas ---")
    response = VoiceResponse()
    response.say("Hola, soy Alice la asistente del Grand Rapids Hotel. ¿En qué puedo ayudarte?", language="es-MX")
    response.gather(
        input='speech',
        action='/process_speech',
        speechTimeout='auto',
        language='es-MX'
    )
    return str(response)

@app.route("/process_speech", methods=['GET', 'POST'])
def process_speech():
    """Procesar la voz del usuario y responder usando el TXT como contexto"""
    user_text = request.form.get('SpeechResult', '')
    response = VoiceResponse()

    if not user_text:
        response.gather(input='speech', action='/process_speech', language='es-MX')
        return str(response)

    print(f"Usuario: {user_text}")

    # OBTENER LAS RESERVAS ACTUALES
    lista_reservas = get_reservas()

    try:
        # 1. PENSAR: Inyectamos las reservas en el system prompt
        completion = ai_client.chat.completions.create(
            model='gpt-4o-mini',
            messages=[
                {
                    "role": "system", 
                    "content": f"Eres Alice, la asistente del Grand Rapids Hotel. Tu base de datos de reservas es esta:\n{lista_reservas}\nInstrucciones: Si el cliente pregunta por una reserva, busca su nombre o email en los datos. Sé muy breve y amable. Máximo 2 frases."
                },
                {"role": "user", "content": user_text}
            ]
        )
        texto_ia = completion.choices[0].message.content
        print(f"Alice: {texto_ia}")

        # 2. HABLAR: ElevenLabs
        audio = voice_client.text_to_speech.convert(
            text=texto_ia,
            voice_id=VOICE_ID,
            model_id='eleven_flash_v2_5'
        )

        filename = f"reply_{int(time.time())}.mp3"
        # Editamos esta ruta para que entre en voz-ia/audios_llamadas/
        ruta_web = f"/var/www/html/voz-ia/audios_llamadas/{filename}"
        save(audio, ruta_web)
        os.chmod(ruta_web, 0o777)

        # Editamos la URL para que SignalWire encuentre el archivo allí dentro
        url_audio = f"https://securitys.space/voz-ia/audios_llamadas/{filename}"
        response.play(url_audio)

        # Seguir escuchando
        response.gather(
            input='speech',
            action='/process_speech',
            speechTimeout='auto',
            language='es-MX'
        )

    except Exception as e:
        response.say("Lo siento, tuve un problema con mi base de datos. ¿Me repites?", language="es-MX")
        response.gather(input='speech', action='/process_speech', language='es-MX')

    return str(response)

if __name__ == "__main__":
    # Usamos el puerto 5000
    app.run(host="0.0.0.0", port=5000, debug=False)
