from typing import Annotated

from fastapi import APIRouter, Depends, Form

from core.security.authentication import require_role, get_user
from schema import GenericResponse
from schema.course import CourseCreateSchema, CourseUpdateSchema
from schema.course_filter import CourseFilter
from services.course import CourseService

course_router = APIRouter(prefix="/course")


@course_router.post("/", dependencies=[Depends(require_role('admin'))], response_model=GenericResponse)
async def create_course(request: Annotated[CourseCreateSchema, Form()], user=Depends(get_user),
                        service=Depends(CourseService)):
    await service.add_new_course(request)
    return {"message": "Course added successfully."}


@course_router.get("/", response_model=GenericResponse)
async def list_all_course(date: str = None, user=Depends(get_user), service=Depends(CourseService)):
    return {"message": "Course populated successfully.", 'data': service.fetch_all_course(date)}


@course_router.get("/{course_id}", response_model=GenericResponse)
async def course_details(course_id: int, user=Depends(get_user),
                         service=Depends(CourseService)):
    return {"message": "Course populated successfully.",
            'data': service.fetch_course_details(course_id)}


@course_router.put("/{course_id}", response_model=GenericResponse)
async def update_course(course_id: int, request: Annotated[CourseUpdateSchema, Form()], user=Depends(get_user),
                        service=Depends(CourseService)):
    await service.update_course(course_id, request)
    return {"message": "Course updated successfully."}


@course_router.delete("/{course_id}", response_model=GenericResponse)
async def delete_course(course_id: int, user=Depends(get_user),
                        service=Depends(CourseService)):
    service.delete_course(course_id)
    return {"message": "Course deleted successfully."}


@course_router.post("/filter", response_model=GenericResponse)
async def course_filter(request: CourseFilter, user=Depends(get_user), service=Depends(CourseService)):
    return {"message": "Course populated successfully.", 'data': service.course_filter(request)}



@course_router.patch("/active_or_deactive/{course_id}", response_model=GenericResponse,
                               dependencies=[Depends(require_role('admin'))])
async def toogle_enable(course_id: int,user=Depends(get_user), service=Depends(CourseService)):
    service.toogle_enable(course_id)
    return {"message": " Success."}