from backend.database.models import Alert
from sqlalchemy.orm import Session


DB_FIELDS = {
    "id",
    "event",
    "category",
    "tier",
    "headline",
    "description",
    "instruction",
    "effective",
    "expires",
    "active",
}


def upsert_alert(db: Session, alert):
    """
    Safe projection: only persist fields that exist in the DB model.
    Prevents schema drift from breaking ingestion.
    """

    payload = alert.model_dump() if hasattr(alert, "model_dump") else alert

    clean = {k: v for k, v in payload.items() if k in DB_FIELDS}

    existing = db.get(Alert, clean["id"])

    if existing:
        for k, v in clean.items():
            setattr(existing, k, v)
    else:
        db.add(Alert(**clean))
