from fastapi import FastAPI, Request, HTTPException, UploadFile, File, WebSocket, WebSocketDisconnect,Form,Body, Depends
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, HTMLResponse,Response
import logging
import shutil
import os
import asyncio
from pydantic import BaseModel, validator
from pydantic import BaseModel, validator, constr  
from typing import Dict, Any, List, Union
import requests
import json
from fastapi.responses import FileResponse
from datetime import datetime
from io import BytesIO
from dotenv import load_dotenv
from jose import jwt, JWTError
from datetime import datetime, timedelta


from chat_tasa import chat_tasa_ia  # Importar funciones de chat IA


from endpoints.transcribir_tasa import router as transcribir_tasa_router

from security.auth_middleware import verify_embed_token
from security.rate_limiter import limiter, RATE_LIMIT_CHAT_IA
from slowapi import _rate_limit_exceeded_handler
from slowapi.errors import RateLimitExceeded


# Configuración de Redis

from clases_tasa import ( ChatError, ChatRequest, ChatResponse)


app = FastAPI(
    title="Catia API",
    version="1.0.0",
    debug=True,
    docs_url=None,
    redoc_url=None,
    openapi_url=None
)

# Configurar rate limiter
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

# Configurar CORS para permitir solicitudes desde los orígenes necesarios
app.add_middleware(
    CORSMiddleware,

    allow_origins=["http://localhost:4200",
        "http://10.51.20.5:5000",
        "http://52.160.93.231:5000",
        "http://52.160.93.231:5001",
        "https://dev.crm.ayudacatastro.co",
        "https://10.51.20.5:5000",
        "https://pre.crm.catastroantioquia-mas.com",
        "https://pre.ayuda.catastroantioquia-mas.com",
        "https://pre.miperfil.catastroantioquia-mas.com",
        "https://core.ayudacatastro.co:5001",
        "https://dev.miperfil.ayudacatastro.co",
        "https://dev.ayudacatastro.co",
        "https://pro.ayudacatastro.co",
        "https://pro.crm.ayudacatastro.co",
        "https://pro.miperfil.ayudacatastro.co",
        "https://dev.ayuda.catastroantioquia-mas.com",
        "https://dev.miperfil.catastroantioquia-mas.com",  
        "https://dev.crm.catastroantioquia-mas.com",
        "https://pru.ayuda.catastroantioquia-mas.com",
        "https://pru.miperfil.catastroantioquia-mas.com",
        "https://pru.crm.catastroantioquia-mas.com",
        "https://ayuda.catastroantioquia-mas.com",
        "https://miperfil.catastroantioquia-mas.com",
        "https://crm.catastroantioquia-mas.com",
        "https://ayuda-catastroantioquia-mas-gedrgchyh2exhrbm.eastus2-01.azurewebsites.net",
        "https://pro.ayuda.catastroantioquia-mas.com",
        "https://pro.miperfil.catastroantioquia-mas.com",
        "https://pro.crm.catastroantioquia-mas.com",
        "https://dev.ayuda.catastroantioquia-mas.com",
        "https://dev.miperfil.catastroantioquia-mas.com",  
        "https://dev.crm.catastroantioquia-mas.com",
        "https://dev.tasa-chat.valormas.gov.co",
        "https://pru.tasa-chat.valormas.gov.co",
        "https://tasa-chat.valormas.gov.co",
        "http://54.145.182.117",
        "https://anttest.valormas.gov.co",
        "https://cic-ware.com"],

    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Configurar logging para capturar y mostrar errores
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


# 🆕 LÍNEA 2 Y 3: Registrar router de transcripción
app.include_router(
    transcribir_tasa_router,
    tags=["TASA - Transcripción Segura"]
)

@app.post(
    "/ask/chat_tasa_ia",
    response_model=ChatResponse,
    responses={
        200: {"model": ChatResponse},
        401: {"description": "No autorizado - Token requerido"},
        403: {"description": "Prohibido - Token inválido o expirado"},
        429: {"description": "Demasiadas solicitudes - Rate limit excedido"},
        500: {"model": ChatError}
    },
    tags=["Chat IA"],
    summary="Enviar mensaje al chat (requiere autenticación)"
)
@limiter.limit(RATE_LIMIT_CHAT_IA)
async def enviar_mensaje_chat(
    request: Request,
    response: Response,
    datos: ChatRequest = Body(...),
    token_data: dict = Depends(verify_embed_token)
):

    
    client_id = token_data.get('clientId', 'desconocido')
    origin = token_data.get('config', {}).get('origin', 'desconocido')
    is_permanent = token_data.get('permanent', False)
    
    logger.info(
        f"📨 Chat request validado - "
        f"Cliente: {client_id}, "
        f"Origen: {origin}, "
        f"Tipo: {'Permanente' if is_permanent else 'Temporal'}, "
        f"SessionId: {datos.sessionId[:8]}***"
    )
    
    resultado = await chat_tasa_ia.enviar_chat_webhook(datos.dict())
    
    return resultado


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=5000)