from __future__ import annotations

from pathlib import Path

from fastapi import APIRouter, Depends
from sqlmodel import Session

from app.api.deps import get_session
from app.services.production_package_generator import generate_review_package
from app.services.production_queue import (
    approve_generation,
    attach_package,
    mark_ready_for_review,
    mark_started,
    next_for_agent,
    propose_concept,
    reject_concept,
    update_queue_item,
)
from app.services.reconciliation import import_existing_audit
from app.services.upload_requests import complete_request, fail_request, mark_sent, pending_agent_requests

router = APIRouter(prefix="/agent", tags=["agent"])


@router.get("/upload-requests/pending")
def pending_upload_requests(session: Session = Depends(get_session)):
    return {"items": pending_agent_requests(session)}


@router.post("/upload-requests/{request_id}/mark-sent")
def mark_upload_sent(request_id: str, session: Session = Depends(get_session)):
    return mark_sent(session, request_id)


@router.post("/upload-requests/{request_id}/attach-audit")
def attach_audit(request_id: str, payload: dict, session: Session = Depends(get_session)):
    imported = import_existing_audit(session, Path(payload["audit_path"]), dry_run=False)
    return complete_request(session, request_id, {"youtube_video_id": imported.get("youtube_video_id"), "upload_audit_id": imported.get("audit_id")})


@router.post("/upload-requests/{request_id}/complete")
def complete_upload_request(request_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return complete_request(session, request_id, payload or {})


@router.post("/upload-requests/{request_id}/fail")
def fail_upload_request(request_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return fail_request(session, request_id, payload or {})


@router.get("/production/next")
def production_next(session: Session = Depends(get_session)):
    return next_for_agent(session)


@router.post("/production/{item_id}/concept-proposed")
def production_concept_proposed(item_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return propose_concept(session, item_id, payload or {})


@router.post("/production/{item_id}/approve-generation")
def production_approve_generation(item_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return approve_generation(session, item_id, payload or {})


@router.post("/production/{item_id}/reject-concept")
def production_reject_concept(item_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return reject_concept(session, item_id, payload or {})


@router.post("/production/{item_id}/mark-started")
def production_started(item_id: str, session: Session = Depends(get_session)):
    return mark_started(session, item_id)


@router.post("/production/{item_id}/generate-review-package")
def production_generate_review_package(item_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return generate_review_package(session, item_id, payload or {})


@router.post("/production/{item_id}/attach-package")
def production_attach_package(item_id: str, payload: dict, session: Session = Depends(get_session)):
    return attach_package(session, item_id, payload)


@router.post("/production/{item_id}/mark-ready-for-review")
def production_ready_for_review(item_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return mark_ready_for_review(session, item_id, payload or {})


@router.post("/production/{item_id}/mark-failed")
def production_failed(item_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return update_queue_item(session, item_id, {"status": "failed", "error": (payload or {}).get("error")})
