from sqlalchemy.orm import Session, joinedload
from fastapi import HTTPException, status
from models.activity_log_model import ActivityLog
from models.user_model import User
from uuid import UUID
from typing import Optional


def log_activity(
    db: Session,
    user_id: UUID,
    ticket_id: UUID,
    action: str,
    old_value: Optional[str] = None,
    new_value: Optional[str] = None,
):
    """Insert a single activity log entry. Caller is responsible for commit."""
    entry = ActivityLog(
        done_by=user_id,
        ticket_id=ticket_id,
        action=action,
        old_value=old_value,
        new_value=new_value,
    )
    db.add(entry)


def get_activity_logs_for_ticket(ticket_id: UUID, db: Session):
    try:
        if not ticket_id:
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail="Ticket id is required to get activity logs",
            )

        logs = (
            db.query(ActivityLog)
            .filter(ActivityLog.ticket_id == ticket_id)
            .options(
                joinedload(ActivityLog.actor).load_only(
                    User.name, User.email
                )
            )
            .order_by(ActivityLog.created_at.desc())
            .all()
        )

        return {"activity_logs": logs}

    except HTTPException as e:
        raise e
    except Exception as e:
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Error: {str(e)}",
        )
