"""
Video Library Router
CRUD operations for the video library
"""
from fastapi import APIRouter, HTTPException, Depends, Query
from typing import Optional, List

from database import get_db, VideoRepository
from security import verify_hmac
from models.schemas import VideoCreate, VideoResponse


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


@router.post("", response_model=VideoResponse)
async def create_video(
    video: VideoCreate,
    db=Depends(get_db),
    authorized: bool = Depends(verify_hmac)
):
    """Add a video to the library"""
    repo = VideoRepository(db)
    
    # Check if already exists
    existing = repo.get_by_url(video.source_url)
    if existing:
        raise HTTPException(status_code=400, detail="Video already exists")
    
    new_video = repo.create(**video.model_dump())
    return new_video


@router.get("", response_model=List[VideoResponse])
async def list_videos(
    skip: int = Query(0, ge=0),
    limit: int = Query(50, ge=1, le=100),
    category: Optional[str] = None,
    db=Depends(get_db),
    authorized: bool = Depends(verify_hmac)
):
    """List all videos with pagination"""
    repo = VideoRepository(db)
    if category:
        return repo.get_by_category(category, limit)
    return repo.get_all(skip, limit)


@router.get("/{video_id}", response_model=VideoResponse)
async def get_video(
    video_id: int,
    db=Depends(get_db),
    authorized: bool = Depends(verify_hmac)
):
    """Get video by ID"""
    repo = VideoRepository(db)
    video = repo.get_by_id(video_id)
    if not video:
        raise HTTPException(status_code=404, detail="Video not found")
    return video


@router.delete("/{video_id}")
async def delete_video(
    video_id: int,
    db=Depends(get_db),
    authorized: bool = Depends(verify_hmac)
):
    """Delete video from library"""
    repo = VideoRepository(db)
    if repo.delete(video_id):
        return {"message": "Video deleted"}
    raise HTTPException(status_code=404, detail="Video not found")


@router.get("/search", response_model=List[VideoResponse])
async def search_videos(
    q: str = Query(..., min_length=1),
    limit: int = Query(20, ge=1, le=50),
    db=Depends(get_db),
    authorized: bool = Depends(verify_hmac)
):
    """Search videos by title"""
    repo = VideoRepository(db)
    return repo.search(q, limit)
