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

# ==================== CONFIGURAR LOGGING PRIMERO ====================
# IMPORTANTE: Esto debe estar ANTES de importar rate_limiter para capturar sus logs
logging.basicConfig(
    level=logging.INFO,
    format='%(levelname)s:%(name)s:%(message)s',
    force=True  # Forzar reconfiguración si ya existe
)
logger = logging.getLogger(__name__)
logger.info("=" * 70)
logger.info("🚀 INICIANDO APLICACIÓN TASA")
logger.info("=" * 70)
# =====================================================================

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://dev2.miperfil.catastroantioquia-mas.com",
                    "https://dev2.crm.catastroantioquia-mas.com",

                    "https://dev2.ayuda.catastroantioquia-mas.com", "https://dev.tasa-chat.valormas.gov.co", "https://pru.tasa-chat.valormas.gov.co", "https://tasa-chat.valormas.gov.co"],

    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

logger.info("✅ Aplicación configurada completamente")

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("2/second")  # NUEVO: Límite por segundo (protección contra burst/flood)
@limiter.limit(RATE_LIMIT_CHAT_IA)  # Límite por minuto (10/minute)
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)