"""Job queries.""" from __future__ import annotations from datetime import datetime from typing import Optional from uuid import UUID from sqlmodel import Session, select from .models import Job def create_job( session: Session, source_asset_id: UUID, video_path: str, timeline_id: UUID, profile_name: str = "soccer_broadcast", run_type: str = "initial", parent_id: UUID | None = None, config_overrides: dict | None = None, ) -> Job: job = Job( source_asset_id=source_asset_id, video_path=video_path, timeline_id=timeline_id, profile_name=profile_name, run_type=run_type, parent_id=parent_id, config_overrides=config_overrides or {}, status="pending", ) session.add(job) session.commit() session.refresh(job) return job def update_job_status( session: Session, job_id: UUID, status: str, current_stage: str | None = None, error_message: str | None = None, ): job = session.get(Job, job_id) if not job: return job.status = status if current_stage is not None: job.current_stage = current_stage if error_message is not None: job.error_message = error_message if status == "running" and not job.started_at: job.started_at = datetime.utcnow() if status in ("completed", "failed", "cancelled"): job.completed_at = datetime.utcnow() session.commit() def get_job(session: Session, job_id: UUID) -> Job | None: return session.get(Job, job_id) def list_jobs( session: Session, timeline_id: UUID | None = None, parent_id: UUID | None = None, status: str | None = None, ) -> list[Job]: stmt = select(Job) if timeline_id: stmt = stmt.where(Job.timeline_id == timeline_id) if parent_id: stmt = stmt.where(Job.parent_id == parent_id) if status: stmt = stmt.where(Job.status == status) stmt = stmt.order_by(Job.created_at.desc()) return list(session.exec(stmt).all())