from datetime import date
from typing import Optional, List

from fastapi import Depends, APIRouter
from pydantic import BaseModel
from starlette.responses import StreamingResponse

from core.security.authentication import get_user
from services.report import ReportService

report_router = APIRouter(prefix="/report")
class AttendanceReport(BaseModel):
    academic_year_id: int
    term_id: int
    start_date: Optional[date]=None
    end_date: Optional[date] = None
    course_category_id: Optional[int] = None
    course_id: Optional[int] = None
    fields:Optional[List[str]]=[]

@report_router.post("/attendance")
async def attendance_report( request:AttendanceReport,user=Depends(get_user),
                            service=Depends(ReportService)):
    data=service.view_attendance_report(request,user)
    return {"message": "Attendance populated successfully.", "data": data}

@report_router.post("/attendance/download")
async def attendance_report_download( request:AttendanceReport,user=Depends(get_user),
                            service=Depends(ReportService)):
    output=service.view_attendance_report_download(request,user)
    return StreamingResponse(
        output,
        media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        headers={"Content-Disposition": "attachment; filename=attendance.xlsx"}
    )
    return {"message": "Attendance populated successfully.", "data": data}


# Student

class StudentData(BaseModel):
    gender: Optional[str]=None
    age: Optional[int] = None
    is_participated_in_wac:Optional[str]=None
    photography_consent:Optional[str]=None
    fields:List[str]=[]


@report_router.post("/student")
async def student_data( request:StudentData,user=Depends(get_user),
                            service=Depends(ReportService)):
    data=service.view_student_data(request,user)
    return {"message": "Participant populated successfully.", "data": data}

@report_router.post("/student/download")
async def student_data_download( request:StudentData,user=Depends(get_user),
                            service=Depends(ReportService)):
    output=service.view_student_data_download(request,user)
    return StreamingResponse(
        output,
        media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        headers={"Content-Disposition": "attachment; filename=attendance.xlsx"}
    )

class EnrollData(BaseModel):
    course_id:Optional[int]=None
    academic_year_id:Optional[int]=None
    term_id:Optional[int]=None
    age_group_id:Optional[int]=None
    course_category_id:Optional[int]=None
    fields: List[str] = []


@report_router.post("/enrolled")
async def enrolled_data( request:EnrollData,user=Depends(get_user),
                            service=Depends(ReportService)):
    data=service.fetch_enrolled_data(request,user)
    return {"message": "Participant populated successfully.", "data": data}

@report_router.post("/enrolled/download")
async def enrolled_data( request:EnrollData,user=Depends(get_user),
                            service=Depends(ReportService)):
    output=service.view_enrolled_download(request,user)
    return StreamingResponse(
        output,
        media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        headers={"Content-Disposition": "attachment; filename=attendance.xlsx"}
    )