from datetime import date, timedelta
from sqlmodel import Session, select
from app.models import Assessment, Answer, Risk, Status, Evidence, Policy, PolicyAcknowledgement, Questionnaire

DISCLAIMER = "SecureFlow provides readiness, alignment, and gap-analysis support only. It does not certify compliance; final determinations require qualified review."

def readiness_score(assessments: list[Assessment]) -> int:
    if not assessments:
        return 0
    weights = {Answer.yes: 1.0, Answer.partial: 0.5, Answer.no: 0.0, Answer.na: 1.0}
    return round(sum(weights[a.answer] for a in assessments) / len(assessments) * 100)

def dashboard(session: Session, tenant_id: int) -> dict:
    assessments = session.exec(select(Assessment).where(Assessment.tenant_id == tenant_id)).all()
    risks = session.exec(select(Risk).where(Risk.tenant_id == tenant_id, Risk.status != Status.completed)).all()
    evidence = session.exec(select(Evidence).where(Evidence.tenant_id == tenant_id)).all()
    policies = session.exec(select(Policy).where(Policy.tenant_id == tenant_id)).all()
    acks = session.exec(select(PolicyAcknowledgement).where(PolicyAcknowledgement.tenant_id == tenant_id)).all()
    questionnaires = session.exec(select(Questionnaire).where(Questionnaire.tenant_id == tenant_id)).all()
    due = date.today() + timedelta(days=45)
    upcoming = sum(1 for e in evidence if e.review_date and e.review_date <= due) + sum(1 for p in policies if p.next_review_date and p.next_review_date <= due)
    missing_evidence = sum(1 for a in assessments if a.answer in (Answer.no, Answer.partial) and not any(e.control_id == a.control_id for e in evidence))
    q_status = round(sum(1 for q in questionnaires if q.status.lower() == "completed") / len(questionnaires) * 100) if questionnaires else 0
    ack_status = round(len(acks) / max(1, len(policies)) * 100) if policies else 0
    score = readiness_score(assessments)
    return {"cyber_readiness_score": score, "cmmc_nist_readiness_score": score, "open_risks": len(risks), "missing_evidence": missing_evidence, "upcoming_reviews": upcoming, "questionnaire_completion_status": q_status, "policy_acknowledgement_status": ack_status, "disclaimer": DISCLAIMER}
