from typing import List, Optional, Dict, Any
import logging
from datetime import datetime
import sys

sys.path.append('/var/www/html/config')

from cnxpdo import get_connection


def obtener_voluntarios(fecha: Optional[str], pagina: int, por_pagina: int) -> Dict[str, Any]:
    conexion = None
    cursor = None

    try:
        # Establece la conexión a la base de datos
        conexion = get_connection()
        if not conexion:
            raise Exception("No se pudo establecer conexión a la base de datos")

        # Validación de fecha (si se pasa)
        if fecha:
            try:
                datetime.strptime(fecha, "%Y-%m-%d")
            except ValueError:
                raise ValueError("Formato de fecha inválido. Use YYYY-MM-DD")

        # Lógica de paginación
        pagina = max(1, int(pagina))
        por_pagina = max(1, min(100, int(por_pagina)))
        offset = (pagina - 1) * por_pagina

        # Construcción de la consulta
        query = "SELECT SQL_CALC_FOUND_ROWS * FROM inscripciones_voluntarios"
        params = []

        if fecha:
            query += " WHERE DATE(fecha_registro) = STR_TO_DATE(%s, '%%Y-%%m-%%d')"
            params.append(fecha)

        query += " ORDER BY id DESC LIMIT %s OFFSET %s"
        params.extend([por_pagina, offset])

        # Ejecución de la consulta
        cursor = conexion.cursor(dictionary=True)
        cursor.execute(query, params)
        datos = cursor.fetchall()

        # Conversión de datetime a string para fecha_registro y agregar id
        for voluntario in datos:
            if isinstance(voluntario['fecha_registro'], datetime):
                voluntario['fecha_registro'] = voluntario['fecha_registro'].strftime('%Y-%m-%d %H:%M:%S')

            # Asegúrate de incluir el ID en cada voluntario
            voluntario['id'] = voluntario['id']  # Se asegura de que el campo id esté presente

        # Obtención del total de registros
        cursor.execute("SELECT FOUND_ROWS()")
        total = cursor.fetchone()["FOUND_ROWS()"]

        return {
            "datos": datos,
            "paginacion": {
                "pagina_actual": pagina,
                "por_pagina": por_pagina,
                "total_registros": total,
                "total_paginas": (total + por_pagina - 1) // por_pagina
            }
        }

    except Exception as e:
        logging.error(f"Error en obtener_voluntarios: {str(e)}")
        raise
    finally:
        # Asegúrate de cerrar siempre la conexión y el cursor
        if cursor:
            cursor.close()
        if conexion:
            conexion.close()




def obtener_todos_voluntarios() -> Dict[str, Any]:
    conexion = None
    cursor = None

    try:
        # Establecer la conexión a la base de datos
        conexion = get_connection()
        if not conexion:
            raise Exception("No se pudo establecer conexión a la base de datos")

        # Consulta SQL para obtener todos los voluntarios sin paginación
        query = "SELECT * FROM inscripciones_voluntarios"
        
        cursor = conexion.cursor(dictionary=True)
        cursor.execute(query)
        voluntarios = cursor.fetchall()

        # Convertir datos a tipo string adecuado y manejar None
        for voluntario in voluntarios:
            # Convertir fecha_registro a formato string
            if isinstance(voluntario['fecha_registro'], datetime):
                voluntario['fecha_registro'] = voluntario['fecha_registro'].strftime('%Y-%m-%d %H:%M:%S')
            
            # Asegurarse de que recomendado, como_ayudar, pasion sean strings
            voluntario['recomendado'] = voluntario.get('recomendado', '') or ''
            voluntario['como_ayudar'] = voluntario.get('como_ayudar', '') or ''
            voluntario['pasion'] = voluntario.get('pasion', '') or ''

        return {
            "success": 1,
            "data": voluntarios
        }

    except Exception as e:
        logging.error(f"Error al obtener voluntarios: {str(e)}")
        return {
            "success": 0,
            "message": f"Error al obtener voluntarios: {str(e)}"
        }
    finally:
        if cursor:
            cursor.close()
        if conexion:
            conexion.close()