from fastapi import Depends, APIRouter, Query

from core.security.authentication import require_role, get_user
from schema import GenericResponse
from schema.bursary_discount import BursaryDiscountInfo, BursaryDiscountInfoListResponse, \
    BursaryDiscountInfoUpdateSchema, BursaryCourseAllocationCreate
from schema.bursary_discount import CreateBursaryApplication, \
    ApplicationListResponse
from services.bursary_discount import BursaryDiscountService

bursary_discount_router = APIRouter(prefix="/bursary_discount")


@bursary_discount_router.post("/info", dependencies=[Depends(require_role('admin'))], response_model=GenericResponse)
async def create_bursary_discount_info(request: BursaryDiscountInfo, user=Depends(get_user),
                                       service: BursaryDiscountService = Depends(BursaryDiscountService)):
    service.create_info(request)
    return {"message": "Bursary discount info created successfully."}


@bursary_discount_router.get("/info", response_model=BursaryDiscountInfoListResponse)
async def list_bursary_discount_info(
        academic_year_id: int = Query(None),
        user=Depends(get_user),
        service: BursaryDiscountService = Depends(BursaryDiscountService)):
    return {"message": "Bursary populated successfully.", "data": service.list_all_info(academic_year_id)}

@bursary_discount_router.get("/academic_year",)
async def bursary_info_academic_year(
        user=Depends(get_user),
        service: BursaryDiscountService = Depends(BursaryDiscountService)):
    return {"message": "Bursary populated successfully.", "data": service.list_bursary_info_academic_year()}


@bursary_discount_router.get("/info/{bursary_discount_id}", response_model=GenericResponse)
async def bursary_discount_detail(bursary_discount_id: int, user=Depends(get_user),
                                  service=Depends(BursaryDiscountService)):
    return {"message": "Bursary discount populated successfully.",
            'data': service.bursary_discount_detail(bursary_discount_id)}


@bursary_discount_router.put("/info/{bursary_discount_id}", response_model=GenericResponse,
                             dependencies=[Depends(require_role('admin'))])
async def update_bursary_discount(bursary_discount_id: int, request: BursaryDiscountInfoUpdateSchema,
                                  user=Depends(get_user), service=Depends(BursaryDiscountService)):
    service.update_bursary_discount(bursary_discount_id, request)
    return {"message": "Bursary discount updated successfully."}


@bursary_discount_router.patch("/info/{bursary_discount_id}", response_model=GenericResponse,
                               dependencies=[Depends(require_role('admin'))])
async def toogle_enable(bursary_discount_id: int,
                        user=Depends(get_user), service=Depends(BursaryDiscountService)):
    service.toogle_enable(bursary_discount_id)
    return {"message": " Success."}


@bursary_discount_router.delete("/info/{bursary_discount_id}", response_model=GenericResponse,
                                dependencies=[Depends(require_role('admin'))])
async def delete_bursary_discount(bursary_discount_id: int, user=Depends(get_user),
                                  service=Depends(BursaryDiscountService)):
    service.delete_bursary_discount(bursary_discount_id)
    return {"message": "Bursary discount deleted successfully."}


"""
Bursary Application
"""


@bursary_discount_router.post("/application", response_model=GenericResponse)
async def create_bursary_application(request: CreateBursaryApplication, user=Depends(get_user),
                                     service: BursaryDiscountService = Depends(BursaryDiscountService)):
    service.create_application(request, user)
    return {"message": "Bursary discount info created successfully."}


@bursary_discount_router.get("/application", response_model=ApplicationListResponse)
async def list_bursary_application(academic_year_id: int = Query(None), name: str = Query(None), age: int = Query(None),
                                   is_approved: bool = Query(None), application_number: str = Query(None),
                                   user=Depends(get_user),
                                   service: BursaryDiscountService = Depends(BursaryDiscountService)):
    return {"message": "Application list populated.",
            "data": service.list_application(academic_year_id, name, age, is_approved, application_number)}


@bursary_discount_router.post("/application/approve/{id}", dependencies=[Depends(require_role('admin'))])
async def approve_bursary_application(id: int, user=Depends(get_user),
                                      service: BursaryDiscountService = Depends(BursaryDiscountService)):
    service.approve_application(id)
    return {"message": "Application approved .", }


@bursary_discount_router.get("/courses", response_model=GenericResponse)
async def list_all_bursary_courses(user=Depends(get_user), service=Depends(BursaryDiscountService)):
    return {"message": "Bursary courses populated successfully.", 'data': service.fetch_all_bursary_courses()}


@bursary_discount_router.post("/course/allocate", response_model=GenericResponse)
async def allocate_course(request: BursaryCourseAllocationCreate, user=Depends(get_user),
                          service=Depends(BursaryDiscountService)):
    service.allocate_course(request)
    return {}


@bursary_discount_router.get("/course/allocated/{application_id}", response_model=GenericResponse)
async def list_allocated_course(application_id: int, user=Depends(get_user),
                                service: BursaryDiscountService = Depends(BursaryDiscountService)):
    return {"data": service.list_allocated_course(application_id)}


@bursary_discount_router.delete("/course/allocated/{allocation_id}", status_code=204)
async def remove_allocated_course(allocation_id: int,
                                  service: BursaryDiscountService = Depends(BursaryDiscountService)):
    service.remove_course_allocation(allocation_id)


@bursary_discount_router.get("/course/allocated/details/{allocation_id}", response_model=GenericResponse)
async def get_allocated_course_details(allocation_id: int, user=Depends(get_user),
                                     service: BursaryDiscountService = Depends(BursaryDiscountService)):
    """Get detailed information about a specific allocated course"""
    return {"message": "Allocated course details retrieved successfully", 
            "data": service.get_allocated_course_details(allocation_id)}


