import sys, os, re

file_path = "/home/fc-abhay/PF/project-management-app/project-management-app-backend/backgroundtask/report_generate.py"
with open(file_path, "r") as f:
    content = f.read()

# 1. Fix signature
old_sig = "def create_new_report(project_id: UUID, requester_email: str, db: Session):"
new_sig = """def create_new_report(
    project_id: UUID, 
    requester_email: str,
    job_id: UUID,
    db: Session,
    report_name: str = None,
    statuses: list = None,
    assignee_ids: list = None,
    reporter_ids: list = None,
    priorities: list = None,
    types: list = None,
    label_ids: list = None,
    release_names: list = None
):"""
content = content.replace(old_sig, new_sig)

# 2. Add JobService import and Path import
imports = """from sqlalchemy.orm import joinedload
from models.job_model import JobService, JobStatus
from pathlib import Path"""
content = content.replace("from sqlalchemy.orm import joinedload", imports)

# 3. Add job progress update at start
job_start = """    project = db.query(Project).options(joinedload(Project.creator)).filter(Project.id == project_id).first()"""
new_job_start = """    
    get_job_details = None
    if job_id:
        get_job_details = db.query(JobService).filter(JobService.id == job_id).first()
        if get_job_details:
            get_job_details.status = JobStatus.IN_PROGRESS
            db.commit()

    try:
        project = db.query(Project).options(joinedload(Project.creator)).filter(Project.id == project_id).first()"""
content = content.replace(job_start, new_job_start)

# 4. Fix query filters
query_start = """    ).filter(Ticket.project_id == project_id).all()"""
new_query = """    ).filter(Ticket.project_id == project_id)
    
    if statuses:
        query = query.filter(Ticket.status.in_(statuses))
    if reporter_ids:
        query = query.filter(Ticket.reporter_id.in_(reporter_ids))
    if assignee_ids:
        query = query.filter(Ticket.assignee_ids.overlap(assignee_ids))
    if priorities:
        query = query.filter(Ticket.priority.in_(priorities))
    if types:
        query = query.filter(Ticket.type.in_(types))
        
    tickets = query.all()
"""
content = content.replace(query_start, new_query)
# Note: we need to replace db.query(Ticket).options(...).filter(Ticket.project_id == project_id).all() with query = ...

# Let's use regex for query replacement to be safe
content = re.sub(
    r"(tickets\s*=\s*db\.query\(Ticket\).*?)\.all\(\)",
    r"query = \1\n" + new_query.replace("    ).filter(Ticket.project_id == project_id)", ""),
    content,
    flags=re.DOTALL
)

# 5. Fix end of file for JobService update
old_end = """    # Generate PDF to a temporary file
    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_pdf:
        pdf_path = tmp_pdf.name
        
    pdf.output(pdf_path)
    
    print(f"Report PDF generated temporarily at: {pdf_path}")
    
    # Send email
    try:
        asyncio.run(send_report_email(requester_email, project.name, pdf_path))
        print(f"Report emailed successfully to {requester_email}")
    finally:
        # Clean up temporary file
        if os.path.exists(pdf_path):
            os.remove(pdf_path)"""

new_end = """    # Generate PDF to a temporary file
    uploads_dir = Path("uploads")
    uploads_dir.mkdir(exist_ok=True)
    safe_name = re.sub(r'[^a-zA-Z0-9_-]', '_', report_name or project.name)
    filename = f"{safe_name}_{str(job_id)[:8]}.pdf"
    pdf_path = uploads_dir / filename
    
    pdf.output(str(pdf_path))
    
    if get_job_details:
        get_job_details.status = JobStatus.COMPLETED
        get_job_details.message = "Report created successfully!"
        get_job_details.report_url = f"/uploads/{filename}"
        db.commit()
        db.refresh(get_job_details)

    except Exception as e:
        if 'get_job_details' in locals() and get_job_details:
            get_job_details.status = JobStatus.REJECTED
            get_job_details.error_message = str(e)
            db.commit()"""
            
content = content.replace(old_end, new_end)

with open(file_path, "w") as f:
    f.write(content)

