import logging

from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session
from sqlalchemy import select

from src.apps.events.models import ProcessedEvent

logger = logging.getLogger(__name__)


async def is_event_processed(db: Session, event_id: str, handler_name: str) -> bool:
    """
    Return True if this (event_id, handler_name) pair has already been recorded,
    indicating the handler should skip reprocessing.
    """
    stmt = select(ProcessedEvent).where(
        ProcessedEvent.event_id == event_id,
        ProcessedEvent.handler_name == handler_name,
    )
    result = db.execute(stmt).scalar_one_or_none()
    return result is not None


async def mark_event_processed(
    db: Session, event_id: str, event_type: str, handler_name: str
) -> None:
    """
    Insert a ProcessedEvent row so subsequent calls to ``is_event_processed``
    return True for this (event_id, handler_name) pair.
    """
    try:
        record = ProcessedEvent(
            event_id=event_id,
            event_type=event_type,
            handler_name=handler_name,
        )
        db.add(record)
        db.commit()
        logger.debug(f"Marked event {event_id} as processed by handler {handler_name}")
    except IntegrityError:
        db.rollback()
        logger.debug(
            f"Event {event_id}/{handler_name} already processed (concurrent write) — skipping"
        )
