# utils/notify.py
from typing import Iterable, Optional
from models import db, Employee  # Employee needed for fan-out
from models import Notification


def notify_employee(
    employee_id: Optional[int],  # None => broadcast row
    title: str,
    message: str = "",
    link: Optional[str] = None,
    commit: bool = True,
):
    n = Notification(employee_id=employee_id, title=title, message=message, link=link)
    db.session.add(n)
    if commit:
        db.session.commit()
    return n


def notify_many(
    employee_ids: Iterable[int],
    title: str,
    message: str = "",
    link: Optional[str] = None,
):
    ids = list({i for i in employee_ids if i})
    if not ids:
        return 0
    objs = [Notification(employee_id=eid, title=title, message=message, link=link) for eid in ids]
    db.session.bulk_save_objects(objs)
    db.session.commit()
    return len(objs)


def notify_broadcast(
    title: str,
    message: str = "",
    link: Optional[str] = None,
    fanout: bool = True,
):
    """
    Broadcast to everyone.
    - fanout=True  -> create one row per active employee (best for per-user unread/read)
    - fanout=False -> create a single NULL (broadcast) row
    """
    if fanout:
        ids = [e.id for e in Employee.query.filter(Employee.status == "active").all()]
        return notify_many(ids, title, message, link)
    # pure broadcast: single row with employee_id = NULL
    notify_employee(None, title, message, link, commit=True)
    return 1