from typing import Annotated,List

from fastapi import APIRouter, Depends, Form
from fastapi.responses import StreamingResponse
import io

from core.security.authentication import get_user

from schema.profile_registration import ProfileRegistrationCreateSchema,ProfileRegistrationUpdateSchema,ProfileRegistrationResponseSchema, ContentListRequestSchema
from services.profile_registration import ProfileRegistrationService


profile_registration_router = APIRouter(prefix="/profile-registration")


@profile_registration_router.post("/", response_model=ProfileRegistrationResponseSchema)
async def create_registration(
    request: Annotated[ProfileRegistrationCreateSchema, Form()],
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):
   
    return await service.create_registration(request, user)
    
@profile_registration_router.get("/", response_model=List[ProfileRegistrationResponseSchema])
async def get_all_registrations(
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):
   
    return service.get_all_registrations(user)
    


@profile_registration_router.get("/{registration_id}",)
async def get_registration_by_id(
    registration_id: int,
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):
    
    return service.get_registration_by_id(registration_id,user)
    

@profile_registration_router.put("/{registration_id}")
async def update_registration(
    registration_id: int,
    request: Annotated[ProfileRegistrationUpdateSchema, Form()],
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):

    return await service.update_registration(registration_id, request, user)
    

@profile_registration_router.delete("/{registration_id}",status_code=204)
async def delete_registration(
    registration_id: int,
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):

    service.delete_registration(registration_id)
    return {
        "message": "Registration deleted successfully"
    }


@profile_registration_router.post("/list-content", response_model=List[ProfileRegistrationResponseSchema])
async def list_content(
    request: ContentListRequestSchema,
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):
    return service.list_content_by_course_and_user(request.course_id, request.user_id, request.user_type)


@profile_registration_router.get("/export/{course_id}/{participant_id}")
async def export_course_registrations_pdf(
    course_id: int,
    participant_id: int,
    user=Depends(get_user),
    service=Depends(ProfileRegistrationService)
):
    """Return a PDF containing profile registrations for a given course."""
    pdf_bytes = service.generate_pdf_by_course(course_id, participant_id, user)
    return StreamingResponse(io.BytesIO(pdf_bytes), media_type="application/pdf", headers={"Content-Disposition": f"attachment; filename=profile_registrations_course_{course_id}.pdf"})
