from io import BytesIO
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from openpyxl import Workbook
from docx import Document
from sqlmodel import Session, select
from app.models import Risk, Evidence, Policy, Assessment, Control
from app.services.scoring import dashboard, DISCLAIMER

def pdf_report(session: Session, tenant_id: int) -> bytes:
    buf = BytesIO(); c = canvas.Canvas(buf, pagesize=letter); y=750
    c.setFont("Helvetica-Bold", 16); c.drawString(72,y,"SecureFlow Executive Cyber Readiness Report"); y-=30
    c.setFont("Helvetica", 10); c.drawString(72,y,DISCLAIMER[:110]); y-=30
    for k,v in dashboard(session, tenant_id).items():
        c.drawString(72,y,f"{k.replace('_',' ').title()}: {v}"); y-=18
    c.showPage(); c.save(); return buf.getvalue()

def risks_xlsx(session: Session, tenant_id: int) -> bytes:
    wb=Workbook(); ws=wb.active; ws.title="POAM Risk Register"
    ws.append(["Title","Description","Control","Severity","Likelihood","Score","Owner","Due Date","Status","Remediation Plan"])
    for r in session.exec(select(Risk).where(Risk.tenant_id==tenant_id)).all():
        ws.append([r.title,r.description,r.control_id,r.severity.value,r.likelihood,r.risk_score,r.owner_id,str(r.due_date or ''),r.status.value,r.remediation_plan])
    buf=BytesIO(); wb.save(buf); return buf.getvalue()

def questionnaire_docx(answer: str) -> bytes:
    doc=Document(); doc.add_heading("SecureFlow Draft Questionnaire Answer",0); doc.add_paragraph(DISCLAIMER); doc.add_paragraph(answer)
    buf=BytesIO(); doc.save(buf); return buf.getvalue()
