from db import get_db
from flask import session

def crear_notificacion(titulo, mensaje, link='#', icono='notifications', color='primary', 
                       usuario_id=None, area_id=None, rol_id=None, 
                       solo_jefes=False, excluir_usuario_id=None):
    conn = get_db()
    cursor = conn.cursor(dictionary=True)
    destinatarios = set()

    try:
        # 1. Si viene un usuario_id directo, se agrega obligatoriamente
        if usuario_id:
            destinatarios.add(int(usuario_id))

        # 2. Si viene por área
        if area_id:
            if solo_jefes:
                cursor.execute("""
                    SELECT DISTINCT u.idusuario 
                    FROM usuarios u
                    INNER JOIN personal pl ON pl.persona_id = u.persona_id
                    INNER JOIN personal_areas pa ON pa.personal_id = pl.id_personal
                    LEFT JOIN cargos c ON pl.cargo_id = c.id_cargo
                    LEFT JOIN usuario_roles ur ON ur.usuario_id = u.idusuario
                    WHERE pa.area_id = %s 
                      AND u.activo = 1
                      AND (
                          ur.rol_id = 1 
                          OR UPPER(c.nombre) LIKE '%JEFE%' 
                          OR UPPER(c.nombre) LIKE '%GERENTE%' 
                          OR UPPER(c.nombre) LIKE '%COORDINADOR%' 
                          OR UPPER(c.nombre) LIKE '%ADMINISTRADOR%'
                      )
                """, (area_id,))
                for j in cursor.fetchall():
                    destinatarios.add(j['idusuario'])
            else:
                cursor.execute("""
                    SELECT u.idusuario 
                    FROM usuarios u
                    INNER JOIN personal pl ON pl.persona_id = u.persona_id
                    INNER JOIN personal_areas pa ON pa.personal_id = pl.id_personal
                    WHERE pa.area_id = %s AND u.activo = 1
                """, (area_id,))
                for r in cursor.fetchall():
                    destinatarios.add(r['idusuario'])

        # 3. Si viene por rol
        if rol_id:
            cursor.execute("SELECT usuario_id FROM usuario_roles WHERE rol_id = %s", (rol_id,))
            for r in cursor.fetchall():
                destinatarios.add(r['usuario_id'])

        # 4. Excluir SOLO si se pide explícitamente y NO cuando es un usuario_id directo enviado adrede
        if excluir_usuario_id:
            destinatarios.discard(int(excluir_usuario_id))

        print(f"🔔 [NOTIFICACIONES] Enviando '{titulo}' a destinatarios: {destinatarios}")

        # 5. Insertar en tabla
        for uid in destinatarios:
            cursor.execute("""
                INSERT INTO notificaciones (usuario_id, titulo, mensaje, link, icono, color, leido)
                VALUES (%s, %s, %s, %s, %s, %s, 0)
            """, (uid, titulo, mensaje, link, icono, color))

        conn.commit()
    except Exception as e:
        if conn:
            conn.rollback()
        print(f"❌ ERROR CRÍTICO en crear_notificacion: {e}")
    finally:
        cursor.close()
        conn.close()