from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import StreamingResponse
from sqlalchemy.orm import Session
from typing import Optional
import io
from .service import Module10ReportService
from .schema import Module10ReportRequest, Module10ReportResponse, Module10ReportPreview
from app.database.main.mysql import get_db
from app.dependency.authantication import JWTPayloadSchema, get_current_student

module_10_report_router = APIRouter()



@module_10_report_router.get("/download10/{group_id}")
async def download_module10_report(
    group_id: int,
    db: Session = Depends(get_db),
    token: JWTPayloadSchema = Depends(get_current_student)
):
    """Download Module 10 KPIs & Metrics PDF report"""
    try:
        service = Module10ReportService(db,token)
        request = Module10ReportRequest(
            group_id=group_id
        )
        buffer = service.generate_module10_report(request)
        
        # Create streaming response
        buffer.seek(0)
        return StreamingResponse(
            io.BytesIO(buffer.read()),
            media_type="application/pdf",
            headers={
                "Content-Disposition": f"attachment; filename=module_10_metrics_report_group_{group_id}.pdf"
            }
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error downloading report: {str(e)}")

@module_10_report_router.get("/preview10/{group_id}", response_model=Module10ReportPreview)
async def preview_module10_report(
    group_id: int,
    db: Session = Depends(get_db),
    token: JWTPayloadSchema = Depends(get_current_student)
):
    """Preview Module 10 report data as JSON"""
    try:
        service = Module10ReportService(db, token)
        return await service._fetch_module10_data(group_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@module_10_report_router.get("/preview-report-pdf10/{group_id}")
async def preview_report_pdf(
    group_id: int,
    db: Session = Depends(get_db),
    token: JWTPayloadSchema = Depends(get_current_student)
):
    """Generate PDF from JSON data and save to uploaded_files"""
    try:
        service = Module10ReportService(db, token)
        file_path = await service.generate_preview_report_pdf(group_id)
        return {"group_id": group_id, "file_path": file_path}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))



