import uuid
from typing import Any

from fastapi import APIRouter, HTTPException
from sqlmodel import func, select

from app.api.deps import CurrentUser, SessionDep
from app.models import (
    Course,
    CourseCreate,
    CoursePublic,
    CoursesPublic,
    CourseUpdate,
    CoursePublicWithImages,
    Message,
)

router = APIRouter()


@router.get("/", response_model=CoursesPublic)
def read_courses(session: SessionDep, skip: int = 0, limit: int = 100) -> Any:
    """
    Retrieve courses.
    """
    count_statement = select(func.count()).select_from(Course)
    count = session.exec(count_statement).one()
    statement = select(Course).offset(skip).limit(limit)
    courses = session.exec(statement).all()

    return CoursesPublic(data=courses, count=count)


@router.get("/{id}", response_model=CoursePublicWithImages)
def read_course(session: SessionDep, id: uuid.UUID) -> Any:
    """
    Get item by ID.
    """
    course = session.get(Course, id)
    if not course:
        raise HTTPException(status_code=404, detail="course not found")
    
    return course


@router.post("/", response_model=CoursePublic)
def create_item(
    *, session: SessionDep, current_user: CurrentUser, course_in: CourseCreate
) -> Any:
    """
    Create new course.
    """
    course = Course.model_validate(course_in)
    session.add(course)
    session.commit()
    session.refresh(course)
    return course


@router.put("/{id}", response_model=CoursePublic)
def update_course(
    *,
    session: SessionDep,
    current_user: CurrentUser,
    id: uuid.UUID,
    course_in: CourseUpdate,
) -> Any:
    """
    Update an course.
    """
    course = session.get(Course, id)
    if not course:
        raise HTTPException(status_code=404, detail="course not found")
    
    update_dict = course_in.model_dump(exclude_unset=True)
    course.sqlmodel_update(update_dict)
    session.add(course)
    session.commit()
    session.refresh(course)
    return course


@router.delete("/{id}")
def delete_course(
    session: SessionDep, current_user: CurrentUser, id: uuid.UUID
) -> Message:
    """
    Delete an course.
    """
    course = session.get(Course, id)
    if not course:
        raise HTTPException(status_code=404, detail="course not found")
    session.delete(course)
    session.commit()
    return Message(message="course deleted successfully")
