import logging
import sys
from urllib.parse import urlparse
from typing import Optional

sys.path.append('/var/www/html/config')

from cnxpdo import get_connection


"""  /-------------------- UTILIDADES --------------------\  """

def dividir_nombre_completo(nombre_completo: str):
    partes = nombre_completo.strip().split()
    if len(partes) == 1:
        return partes[0], ""
    return partes[0], " ".join(partes[1:])

def validar_grupo_wp(valor: str) -> Optional[str]:
    if valor and valor.lower() != "no":
        parsed = urlparse(valor)
        if not parsed.scheme or not parsed.netloc:
            raise ValueError("El grupo WhatsApp debe ser una URL válida o 'No'")
        return valor
    return None


""" /---------------- Funciones de accion ----------------\ """
def verificar_existencia(correo: str, documento: str):
    conexion = None
    cursor = None
    
    try:
        conexion = get_connection()
        if conexion is None:
            return {
                "success": False,
                "message": "Error de conexión a la base de datos"
            }

        query = """
            SELECT id 
            FROM inscripciones_voluntarios 
            WHERE correos = %s OR documento = %s
        """
        cursor = conexion.cursor(dictionary=True)
        cursor.execute(query, (correo, documento))
        resultado = cursor.fetchone()

        return {
            "success": True,
            "existe": bool(resultado),
            "data": resultado
        }

    except Exception as e:
        logging.error(f"Error en verificar_existencia: {str(e)}")
        return {
            "success": False,
            "message": f"Error al verificar existencia: {str(e)}"
        }

    finally:
        if cursor:
            cursor.close()
        if conexion:
            conexion.close()


def insertar_inscripcion(datos: dict):
    conexion = cursor = None
    try:
        conexion = get_connection()
        if conexion is None:
            raise Exception("Error de conexión")

        cursor = conexion.cursor()
        nombres, apellidos = dividir_nombre_completo(datos["nombre_completo"])
        grupo_wp = validar_grupo_wp(datos.get("grupo_wp", ""))
        grupo_wp1 = validar_grupo_wp(datos.get("grupo_wp1", ""))

        # Modificación de la query para incluir la columna "estado_etapa" con valor fijo 1
        query = """
            INSERT INTO inscripciones_voluntarios (
                tipo_documento, documento, nombres, apellidos, correos,
                telefono, pais, departamento, ciudad, direccion, genero,
                recomendado, nombre_recomendador, grupo_wp, grupo_wp1,
                como_ayudar, pasion, estado_etapa
            ) VALUES (
                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 1 )
        """

        # Tupla de valores con el valor fijo 1 para "estado_etapa"
        valores = (
            datos["tipo_documento"],
            datos["numero_documento"],
            nombres,
            apellidos,
            datos["correo_electronico"].lower(),
            datos["telefono"],
            datos["pais"],
            datos["departamento"],
            datos["ciudad"],
            datos["direccion"],
            datos["genero"],
            datos.get("recomendado_por"),
            datos.get("nombre_recomendador"),
            grupo_wp,
            grupo_wp1,
            datos.get("como_ayudar"),
            datos.get("pasion"),
        )

        cursor.execute(query, valores)
        conexion.commit()

        return {
            "success": True,
            "message": "Inscripción registrada exitosamente",
            "id": cursor.lastrowid
        }

    except ValueError as ve:
        return {
            "success": False,
            "message": str(ve)
        }

    except Exception as e:
        logging.error(f"Error al insertar inscripción: {str(e)}")
        return {
            "success": False,
            "message": f"Error al registrar la inscripción: {str(e)}"
        }

    finally:
        if cursor: cursor.close()
        if conexion: conexion.close()


def procesar_inscripcion(datos: dict):
    try:
        res = verificar_existencia(datos["correo_electronico"], datos["numero_documento"])
        
        if res.get("success") and res.get("existe"):
            return {
                "success": False,
                "message": "Ya existe una inscripción con este correo electrónico o número de documento",
                "existe": True
            }
        elif not res.get("success"):
            return {
                "success": False,
                "message": res.get("message", "Error al verificar existencia")
            }

        return insertar_inscripcion(datos)

    except Exception as e:
        logging.exception("Error inesperado en procesar_inscripcion")
        return {
            "success": False,
            "message": f"Error del servidor: {str(e)}"
        }