from typing import Annotated, List
from fastapi import APIRouter, Depends, Form, UploadFile, File
from core.security.authentication import require_role, get_user
from schema import GenericResponse
from schema.bursary_class_form import BursaryClassCreateSchema, BursaryClassUpdateSchema, BursaryClassFormDetailsSchema
from services.bursary_class import BursaryClassService

bursary_class_router = APIRouter(prefix="/bursary_class")


@bursary_class_router.post("/", dependencies=[Depends(require_role('admin'))], response_model=GenericResponse)
async def create_bursary_class(
    parent_id: Annotated[int, Form()],
    parent_primary_contact: Annotated[str, Form()],
    parent_secondary_contact: Annotated[str, Form()] = None,
    parent_email: Annotated[str, Form()] = None,
    file: UploadFile = File(default=None),
    user=Depends(get_user),
    service=Depends(BursaryClassService)
):
    await service.create_bursary_class_form(parent_id, parent_primary_contact, parent_secondary_contact, parent_email, file)
    return {"message": "Bursary Class created successfully."}


@bursary_class_router.get("/", response_model=GenericResponse)
async def list_bursary_class(date: str = None, user=Depends(get_user), service=Depends(BursaryClassService)):
    return {"message": "Bursary Class populated successfully.", 'data': service.list_all_bursary_class()}


@bursary_class_router.get("/{bursary_class_id}", response_model=GenericResponse)
async def bursary_class_details(bursary_class_id: int, user=Depends(get_user),
                         service=Depends(BursaryClassService)):
    return {"message": "Bursary Class populated successfully.",
            'data': service.fetch_bursary_clas_details(bursary_class_id)}


@bursary_class_router.put("/{bursary_class_id}", response_model=GenericResponse)
async def update_bursary_class(
    bursary_class_id: int,
    parent_id: Annotated[int, Form()],
    parent_primary_contact: Annotated[str, Form()],
    parent_secondary_contact: Annotated[str, Form()] = None,
    parent_email: Annotated[str, Form()] = None,
    file: UploadFile = File(default=None),
    user=Depends(get_user),
    service=Depends(BursaryClassService)
):
    await service.update_bursary_class(bursary_class_id, parent_id, parent_primary_contact, parent_secondary_contact, parent_email, file)
    return {"message": "Bursary Class updated successfully."}


@bursary_class_router.delete("/{bursary_class_id}", response_model=GenericResponse)
async def delete_bursary_class(bursary_class_id: int, user=Depends(get_user),
                        service=Depends(BursaryClassService)):
    service.delete_bursary_class(bursary_class_id)
    return {"message": "Bursary Class deleted successfully."}
