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

from app.api.deps import get_session
from app.models.core import ApiCallLog, PublishJob, YouTubeUploadAudit
from app.services.tiktok_verification import create_tiktok_draft_attempt, list_tiktok_attempts, tiktok_config_status
from app.services.youtube_upload import private_upload

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

@router.post("/tiktok/upload-draft/{post_draft_id}")
def tiktok_upload_draft(post_draft_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return create_tiktok_draft_attempt(session, post_draft_id, payload or {})


@router.get("/tiktok/attempts")
def tiktok_attempts(session: Session = Depends(get_session)):
    return list_tiktok_attempts(session)


@router.get("/tiktok/status")
def tiktok_status(session: Session = Depends(get_session)):
    return tiktok_config_status(session)

@router.post("/youtube/private-upload/{post_draft_id}")
def youtube_private_upload(post_draft_id: str, payload: dict | None = None, session: Session = Depends(get_session)):
    return private_upload(session, post_draft_id, payload or {})


@router.get("/youtube/audits")
def youtube_upload_audits(session: Session = Depends(get_session)):
    rows = session.exec(select(YouTubeUploadAudit).order_by(YouTubeUploadAudit.created_at.desc()).limit(100)).all()
    return {"items": [row.model_dump(mode="json") for row in rows]}


@router.post("/youtube/upload/{post_draft_id}")
def youtube_upload(post_draft_id: str, payload: dict | None=None, session: Session=Depends(get_session)):
    # Backwards-compatible alias, but Sprint 8 validation still enforces private-only and confirmations.
    return private_upload(session, post_draft_id, payload or {})

@router.get("/jobs/{job_id}")
def get_job(job_id: str, session: Session=Depends(get_session)):
    job=session.get(PublishJob, job_id)
    if not job: raise HTTPException(404,"Job not found")
    return job.model_dump(mode="json")

@router.get("/logs")
def logs(session: Session=Depends(get_session)):
    return {"items":[x.model_dump(mode="json") for x in session.exec(select(ApiCallLog).order_by(ApiCallLog.created_at.desc())).all()]}
