import uuid
from datetime import datetime, timezone
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

from app.core.database import Base
from app.models.catalog import UserAccount
from app.logging.models import ActivityLog
from app.logging.activity_logger import ActivityLogger


def make_session():
    engine = create_engine("sqlite:///:memory:", echo=False)
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    return Session()


def make_user(db):
    now = datetime.now(timezone.utc).isoformat()
    user = UserAccount(
        id=str(uuid.uuid4()),
        username="actor",
        display_name="Actor User",
        password_hash="hash",
        role="admin",
        is_active=1,
        created_at=now,
        updated_at=now,
    )
    db.add(user)
    db.commit()
    return user


def test_log_creates_entry():
    db = make_session()
    user = make_user(db)
    logger = ActivityLogger(db)
    logger.log(
        actor_id=user.id,
        action="user.create",
        resource_type="user",
        resource_id=user.id,
        detail={"username": "actor"},
    )
    count = db.query(ActivityLog).count()
    assert count == 1


def test_log_does_not_raise_on_failure():
    """ActivityLogger.log() must be silent even when the DB write fails."""
    db = make_session()
    logger = ActivityLogger(db)
    # Pass an invalid actor_id (FK constraint) — should swallow the error
    logger.log(
        actor_id="nonexistent-id",
        action="auth.login",
        resource_type="user",
    )
    # If we reach here, the test passes — no exception was raised
