import sys
import os
from datetime import datetime
# Agrega la ruta absoluta al sys.path
sys.path.append('/var/www/html/config')
from cnxpdo import get_connection

def getContactosKPIs():
    """
    Obtiene todos los KPIs del dashboard de contactos en una sola consulta
    """
    try:
        conexionBD = get_connection()
        if conexionBD is None:
            return {"success": 0, "message": "Error de conexión"}
        
        cursor = conexionBD.cursor(dictionary=True)
        
        # Query principal que obtiene todos los KPIs
        query = """
            SELECT
                -- Estados de Contactos (usando la relación con estados_etapas)
                SUM(CASE WHEN ee.estado_etapa IN ('Prospecto', 'Primer contacto', 'Fidelización') THEN 1 ELSE 0 END) as contactos_activos,
                SUM(CASE WHEN ee.estado_etapa = 'Descartado' THEN 1 ELSE 0 END) as contactos_descartados,
                SUM(CASE WHEN ee.estado_etapa = 'Consolidación' THEN 1 ELSE 0 END) as contactos_consolidacion,
                
                -- Demografía (por género)
                SUM(CASE WHEN ucp.genero = 'Masculino' THEN 1 ELSE 0 END) as contactos_hombres,
                SUM(CASE WHEN ucp.genero = 'Femenino' THEN 1 ELSE 0 END) as contactos_mujeres,
                SUM(CASE WHEN ucp.genero IS NULL OR ucp.genero NOT IN ('Masculino', 'Femenino') THEN 1 ELSE 0 END) as contactos_otros,
                
                -- Ubicación (urbano vs rural)
                SUM(CASE WHEN ucp.ciudad IS NOT NULL AND ucp.ciudad != '' THEN 1 ELSE 0 END) as contactos_urbanos,
                SUM(CASE WHEN ucp.ciudad IS NULL OR ucp.ciudad = '' THEN 1 ELSE 0 END) as contactos_rurales,
                
                -- Interés Ambiental
                SUM(CASE WHEN ucp.intereses = 'AMBIENTE' THEN 1 ELSE 0 END) as contactos_interes_ambiente,
                
                -- Total de contactos para referencia
                COUNT(*) as total_contactos
                
            FROM union_contactos_personas ucp
            LEFT JOIN estados_etapas ee ON ee.id = ucp.estado_etapa
        """
        
        cursor.execute(query)
        result = cursor.fetchone()
        cursor.close()
        conexionBD.close()
        
        if result:
            # Estructurar la respuesta con los datos obtenidos
            kpis_data = {
                # Estados de Contactos
                "contactos_activos": result["contactos_activos"] or 0,
                "contactos_descartados": result["contactos_descartados"] or 0,
                "contactos_consolidacion": result["contactos_consolidacion"] or 0,
                
                # Seguimiento de Campañas (por ahora valores placeholder)
                "total_contactados": result["total_contactos"] or 0,
                "contactos_interesados": 0,  # Placeholder - mapear cuando tengas los datos
                "contactos_confirmados": 0,  # Placeholder - mapear cuando tengas los datos
                
                # Demografía
                "contactos_hombres": result["contactos_hombres"] or 0,
                "contactos_mujeres": result["contactos_mujeres"] or 0,
                "contactos_otros": result["contactos_otros"] or 0,
                
                # Ubicación
                "contactos_urbanos": result["contactos_urbanos"] or 0,
                "contactos_rurales": result["contactos_rurales"] or 0,
                
                # Interés Ambiental
                "contactos_interes_ambiente": result["contactos_interes_ambiente"] or 0,
                
                # Metadatos
                "total_contactos": result["total_contactos"] or 0,
                "fecha_consulta": datetime.now().isoformat()
            }
            
            return {"success": 1, "data": kpis_data}
        else:
            return {"success": 0, "message": "No se encontraron datos"}
            
    except Exception as e:
        return {"success": 0, "message": f"Error al obtener KPIs: {str(e)}"}

def getContactosEstados():
    """
    Función específica para obtener solo los estados de contactos
    """
    try:
        conexionBD = get_connection()
        if conexionBD is None:
            return {"success": 0, "message": "Error de conexión"}
        
        cursor = conexionBD.cursor(dictionary=True)
        query = """
            SELECT
                ee.estado_etapa,
                COUNT(*) as cantidad
            FROM union_contactos_personas ucp
            LEFT JOIN estados_etapas ee ON ee.id = ucp.estado_etapa
            GROUP BY ee.estado_etapa, ucp.estado_etapa
            ORDER BY COUNT(*) DESC
        """
        
        cursor.execute(query)
        rows = cursor.fetchall()
        cursor.close()
        conexionBD.close()
        
        return {"success": 1, "data": rows}
        
    except Exception as e:
        return {"success": 0, "message": f"Error al obtener estados: {str(e)}"}

def getContactosDemografia():
    """
    Función específica para obtener demografía de contactos
    """
    try:
        conexionBD = get_connection()
        if conexionBD is None:
            return {"success": 0, "message": "Error de conexión"}
        
        cursor = conexionBD.cursor(dictionary=True)
        query = """
            SELECT
                CASE 
                    WHEN genero = 'Masculino' THEN 'Masculino'
                    WHEN genero = 'Femenino' THEN 'Femenino'
                    ELSE 'No Especificado'
                END as genero_categoria,
                COUNT(*) as cantidad
            FROM union_contactos_personas
            GROUP BY genero_categoria
            ORDER BY cantidad DESC
        """
        
        cursor.execute(query)
        rows = cursor.fetchall()
        cursor.close()
        conexionBD.close()
        
        return {"success": 1, "data": rows}
        
    except Exception as e:
        return {"success": 0, "message": f"Error al obtener demografía: {str(e)}"}

def getContactosUbicacion():
    """
    Función específica para obtener ubicación de contactos
    """
    try:
        conexionBD = get_connection()
        if conexionBD is None:
            return {"success": 0, "message": "Error de conexión"}
        
        cursor = conexionBD.cursor(dictionary=True)
        query = """
            SELECT
                CASE 
                    WHEN ciudad IS NOT NULL AND ciudad != '' THEN 'Urbano'
                    ELSE 'Rural'
                END as tipo_ubicacion,
                COUNT(*) as cantidad
            FROM union_contactos_personas
            GROUP BY tipo_ubicacion
            ORDER BY cantidad DESC
        """
        
        cursor.execute(query)
        rows = cursor.fetchall()
        cursor.close()
        conexionBD.close()
        
        return {"success": 1, "data": rows}
        
    except Exception as e:
        return {"success": 0, "message": f"Error al obtener ubicación: {str(e)}"}

def getContactosIntereses():
    """
    Función específica para obtener intereses de contactos
    """
    try:
        conexionBD = get_connection()
        if conexionBD is None:
            return {"success": 0, "message": "Error de conexión"}
        
        cursor = conexionBD.cursor(dictionary=True)
        query = """
            SELECT
                interes,
                COUNT(*) as cantidad
            FROM union_contactos_personas
            WHERE interes IS NOT NULL AND interes != ''
            GROUP BY interes
            ORDER BY cantidad DESC
        """
        
        cursor.execute(query)
        rows = cursor.fetchall()
        cursor.close()
        conexionBD.close()
        
        return {"success": 1, "data": rows}
        
    except Exception as e:
        return {"success": 0, "message": f"Error al obtener intereses: {str(e)}"}