from typing import Union, Optional, List
from pydantic import BaseModel, EmailStr, constr, validator, HttpUrl
from fastapi import UploadFile


""" ======================= MODELOS DE DATOS GET ======================= """
# ---------- MODELOS PARA /ask/verificarExistencia ----------
class VerificarExistenciaRequest(BaseModel):
    correo: EmailStr
    documento: constr(min_length=4, max_length=20)

class VerificarExistenciaResponse(BaseModel):
    success: bool
    existe: bool
    data: Optional[dict] = None

class VerificarExistenciaError(BaseModel):
    success: bool
    message: str


# ---------- MODELOS PARA /ask/obtenerVoluntarios ----------
class VoluntariosRequest(BaseModel):
    fecha: Optional[str] = None  # Fecha opcional en formato YYYY-MM-DD
    pagina: int = 1  # Página para la paginación, valor por defecto 1
    por_pagina: int = 10  # Número de resultados por página, valor por defecto 10

class Voluntario(BaseModel):
    id: int
    tipo_documento: str
    documento: str
    nombres: str
    apellidos: str
    correos: str
    telefono: str
    pais: str
    departamento: str
    ciudad: str
    direccion: str
    genero: str
    recomendado: Optional[str] = None
    nombre_recomendador: Optional[str] = None
    grupo_wp: Optional[str] = None
    grupo_wp1: Optional[str] = None
    como_ayudar: Optional[str] = None
    pasion: Optional[str] = None
    fecha_registro: str


class Paginacion(BaseModel):
    pagina_actual: int
    por_pagina: int
    total_registros: int
    total_paginas: int

class VoluntariosResponse(BaseModel):
    success: int
    data: List[Voluntario]
    paginacion: Optional[dict] = None  # Información de paginación (opcional)


class ErrorResponse(BaseModel):
    success: int
    message: str

# ---------- MODELOS PARA /ask/totalDescargasGlobal ----------
# Clase para estructurar la respuesta con el total de descargas
class TotalDescargasResponse(BaseModel):
    success: int
    total: int

# Modelo de respuesta para errores
class TotalDescargasErrorResponse(BaseModel):
    success: int
    message: str





""" ======================= MODELOS DE DATOS POST ======================= """
# ---------- MODELOS PARA /ask/inscribir ----------
class InscribirRequest(BaseModel):
    tipo_documento: str
    numero_documento: constr(min_length=4)
    nombre_completo: str
    correo_electronico: EmailStr
    telefono: str
    pais: str
    departamento: str
    ciudad: str
    direccion: str
    genero: str
    recomendado_por: Optional[str] = None
    nombre_recomendador: Optional[str] = None
    grupo_wp: Optional[str] = None
    grupo_wp1: Optional[str] = None
    como_ayudar: Optional[str] = None
    pasion: Optional[str] = None

class InscribirResponse(BaseModel):
    success: bool
    message: str
    id: Optional[int] = None
    existe: Optional[bool] = None

class InscribirError(BaseModel):
    success: bool
    message: str


# ---------- MODELOS PARA /ask/chat-n8n ----------
class ChatN8nRequest(BaseModel):
    sessionId: constr(strip_whitespace=True, min_length=1)
    pregunta: constr(strip_whitespace=True, min_length=1)

class ChatN8nResponse(BaseModel):
    success: bool
    message: str
    data: Optional[dict] = None

class ChatN8nError(BaseModel):
    success: bool
    message: str


# ---------- MODELOS PARA /ask/boton_descargas ----------
class BotonDescargaRequest(BaseModel):
    nombre: constr(strip_whitespace=True, min_length=1)
    num_doc_identidad: constr(strip_whitespace=True, min_length=4)
    num_contador: Optional[int] = 1  # por defecto 1 si no lo envían

class BotonDescargaResponse(BaseModel):
    success: bool
    message: str
    nombre: Optional[str] = None
    num_doc_identidad: Optional[str] = None
    num_contador: Optional[int] = None
    fecha_hora: Optional[str] = None

class BotonDescargaError(BaseModel):
    success: bool
    message: str


class PropuestaRequest(BaseModel):
    nombreCompleto: str
    email: str
    tipoDocumento: str
    documento: str
    telefono: str
    ciudad: str
    tituloPropuesta: str
    ambitoPropuesta: str
    descripcionPropuesta: str
    adjuntoNombre: Optional[str] = None  # Nombre del archivo adjunto
    adjunto: Optional[List[UploadFile]] = None

    
class Noticia(BaseModel):
    id: int
    principal: int
    fecha_noticia: str 
    titulo: str
    texto_corto: str
    texto_largo: str
    link: str
    imagen: str


class NoticiasResponse(BaseModel):
    success: int
    data: List[Noticia]



class Propuestas(BaseModel):
    id: int
    titulo: str
    texto: str
    imagen: str
    icono:str


class PropuestasResponse(BaseModel):
    success: bool
    message: str
    data: List[Propuestas]



class insertarInscripcionWpRequest(BaseModel):
    nombre_completo: str
    tipo_documento: str
    documento: str
    telefono: str
    nombre_grp_wp_regionales: str
    url_grp_wp_regionales: str
    nombre_grp_wp_tema_interes: str
    url_grp_wp_tema_interes: str


# ---------- MODELOS PARA /ask/insertarRespuestasEncuesta ----------
class RespuestaEncuesta(BaseModel):
    id_enc_det: int
    respuesta_usuario: str

class InsertarRespuestasEncuestaRequest(BaseModel):
    respuestas: List[RespuestaEncuesta]

class InsertarRespuestasEncuestaResponse(BaseModel):
    success: bool
    message: str
    respuestas_insertadas: Optional[int] = None
    total_enviadas: Optional[int] = None
    errores: Optional[List[str]] = None

class InsertarRespuestasEncuestaError(BaseModel):
    success: bool
    message: str
    errores: Optional[List[str]] = None


# ---------- MODELOS PARA /ask/obtenerPreguntasConRespuestas ----------
class RespuestaOpcion(BaseModel):
    id_enc_res_preg: int
    respuesta_pregunta: str

class PreguntaCompleta(BaseModel):
    id_enc_det: int
    id_enc: int
    pregunta: str
    tipo_pregunta: str
    obligatorio: bool
    respuestas_opciones: List[RespuestaOpcion]

class ObtenerPreguntasConRespuestasResponse(BaseModel):
    success: bool
    message: str
    data: List[PreguntaCompleta]
    total_preguntas: Optional[int] = None

class ObtenerPreguntasConRespuestasError(BaseModel):
    success: bool
    message: str


