"""프로비저닝/오퍼레이션 로그 API 라우터."""

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session as OrmSession

from app.api.deps import get_db, get_current_user, verify_project_access
from app.core.errors import AppError
from app.i18n.loader import t
from app.models.catalog import UserAccount
from app.modules.provenance import ProvenanceRecorder
from app.schemas.operation import (
    OperationDetailResponse,
    OperationLogResponse,
    OperationSummary,
)

router = APIRouter(
    prefix="/api/v1/projects/{project_id}",
    tags=["operations"],
)


@router.get("/operations", response_model=list[OperationLogResponse])
def list_operations(
    operation_type: str | None = Query(default=None),
    episode_id: str | None = Query(default=None),
    offset: int = Query(default=0, ge=0),
    limit: int = Query(default=50, ge=1, le=200),
    project_id: str = Depends(verify_project_access),
    db: OrmSession = Depends(get_db),
    current_user: UserAccount = Depends(get_current_user),
):
    """List operation logs (paginated, filter by type/episode)."""
    recorder = ProvenanceRecorder(db, project_id)
    return recorder.get_operations(
        operation_type=operation_type,
        episode_id=episode_id,
        offset=offset,
        limit=limit,
    )


@router.get("/operations/summary", response_model=list[OperationSummary])
def get_operations_summary(
    project_id: str = Depends(verify_project_access),
    db: OrmSession = Depends(get_db),
    current_user: UserAccount = Depends(get_current_user),
):
    """Get aggregated stats per operation type."""
    recorder = ProvenanceRecorder(db, project_id)
    return recorder.get_summary()


@router.get("/operations/{op_id}", response_model=OperationDetailResponse)
def get_operation(
    op_id: str,
    project_id: str = Depends(verify_project_access),
    db: OrmSession = Depends(get_db),
    current_user: UserAccount = Depends(get_current_user),
):
    """Get single operation detail."""
    recorder = ProvenanceRecorder(db, project_id)
    op = recorder.get_operation(op_id)
    if not op:
        raise AppError(
            code="operation.not_found",
            message=t("operation.not_found"),
            status_code=404,
        )
    return op
