from __future__ import annotations

from fastapi import APIRouter, Depends
from sqlmodel import Session, select

from app.api.deps import get_session
from app.models.core import UploadRequest
from app.services.upload_requests import create_existing_upload_request, ensure_default_executors, serialize_executor, serialize_upload_request
from app.services.youtube_upload_orchestrator import build_youtube_description, execute_existing_jarvis_upload, prepare_upload_snapshot, save_and_approve

router = APIRouter(prefix="/upload-requests", tags=["upload-requests"])


@router.get("/executors")
def executors(session: Session = Depends(get_session)):
    return {"items": [serialize_executor(e) for e in ensure_default_executors(session)]}


@router.get("")
def list_upload_requests(session: Session = Depends(get_session)):
    rows = session.exec(select(UploadRequest).order_by(UploadRequest.created_at.desc())).all()
    return {"items": [serialize_upload_request(r) for r in rows], "count": len(rows)}


@router.post("/youtube-description-preview")
def youtube_description_preview(payload: dict):
    return {"description": build_youtube_description(payload.get("description"), payload.get("tags") or [])}


@router.get("/youtube-private/{post_draft_id}/snapshot")
def youtube_private_snapshot(post_draft_id: str, session: Session = Depends(get_session)):
    return {"upload_snapshot": prepare_upload_snapshot(session, post_draft_id)}


@router.post("/youtube-private/{post_draft_id}/save-and-approve")
def save_and_approve_youtube_private(post_draft_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return save_and_approve(session, post_draft_id, payload)


@router.post("/{upload_request_id}/execute-existing-jarvis")
def execute_existing_jarvis(upload_request_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return execute_existing_jarvis_upload(session, upload_request_id, payload)


@router.post("/existing-jarvis/{post_draft_id}")
def create_existing_jarvis_request(post_draft_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return create_existing_upload_request(session, post_draft_id, payload)
