from fastapi import APIRouter, Depends, status, Request, BackgroundTasks, HTTPException
from fastapi.responses import FileResponse
from sqlalchemy.orm import Session
from utils.get_db import get_db
from schema.report_schema import ReportCreateSchema
from services.reports_service import create_report
from models.job_model import JobService, JobStatus
from backgroundtask.report_generate import generate_project_report_pdf
from uuid import UUID


job_router=APIRouter()

@job_router.post('/create-project-report',status_code=status.HTTP_201_CREATED)
def create_single_report(payload:ReportCreateSchema,request:Request, background_task:BackgroundTasks,db:Session=Depends(get_db)):
    return create_report(payload,request, background_task,db)

@job_router.get('/jobs', status_code=status.HTTP_200_OK)
def get_user_jobs(request: Request, db: Session = Depends(get_db), page: int = 1, limit: int = 10, search: str = None):
    user_id = request.state.user.id
    query = db.query(JobService).filter(JobService.created_by == user_id)
    
    if search:
        query = query.filter(JobService.job_name.ilike(f"%{search}%"))
        
    total = query.count()
    offset = (page - 1) * limit
    jobs = query.order_by(JobService.created_at.desc()).offset(offset).limit(limit).all()
    
    return {
        "data": jobs,
        "total": total,
        "page": page,
        "limit": limit,
        "total_pages": (total + limit - 1) // limit if limit > 0 else 1
    }

@job_router.get('/download/{job_id}', status_code=status.HTTP_200_OK)
def download_report(job_id: UUID, request: Request, db: Session = Depends(get_db)):
    user_id = request.state.user.id
    job = db.query(JobService).filter(JobService.id == job_id, JobService.created_by == user_id).first()
    if not job:
        raise HTTPException(status_code=404, detail="Job not found")
    
    if job.status != JobStatus.COMPLETED:
        raise HTTPException(status_code=400, detail="Report is not completed yet")
    if not job.report_url:
        raise HTTPException(status_code=404, detail="Report file URL not found")
        
    import os
    file_path = f".{job.report_url}"
    if not os.path.exists(file_path):
        raise HTTPException(status_code=404, detail="Report file is missing from server")
        
    return FileResponse(
        path=file_path, 
        media_type="application/pdf", 
        filename=f"report_{job.project_id}.pdf"
    )

@job_router.delete('/jobs/{job_id}', status_code=status.HTTP_200_OK)
def delete_report(job_id: UUID, request: Request, db: Session = Depends(get_db)):
    user_id = request.state.user.id
    job = db.query(JobService).filter(JobService.id == job_id, JobService.created_by == user_id).first()
    if not job:
        raise HTTPException(status_code=404, detail="Job not found")
    
    if job.report_url:
        import os
        file_path = f".{job.report_url}"
        if os.path.exists(file_path):
            try:
                os.remove(file_path)
            except Exception as e:
                pass
                
    db.delete(job)
    db.commit()
    return {"message": "Report deleted successfully"}