CRITICAL = ["playbook_id","channel","surface","content_intent","asset_type","aspect_ratio_class","duration_class","rights_state","metric_definition","metric_version_date","experiment_ref","evidence_ref"]
GENERIC_METRICS = {"views","view","engagement","reach","performance"}

def evaluate(c):
    missing=[k for k in CRITICAL if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    format_valid=bool(c.get("surface_format_checked")) and bool(c.get("aspect_ratio_valid"))
    rights_valid=(c.get("rights_state")=="CLEARED")
    metric_valid=bool(c.get("metric_semantics_current")) and str(c.get("metric_definition","")).strip().lower() not in GENERIC_METRICS
    experiment_comparable=bool(c.get("prior_experiment_comparable",True)) and not bool(c.get("rebaseline_required",False))

    if not evidence_complete:
        state="HOLD_MISSING_EVIDENCE"
    elif not rights_valid:
        state="BLOCKED_RIGHTS"
    elif not format_valid:
        state="BLOCKED_FORMAT_MISMATCH"
    elif not bool(c.get("duration_valid")):
        state="REVISE_DURATION_CONSTRAINT"
    elif str(c.get("metric_definition","")).strip().lower() in GENERIC_METRICS:
        state="REVISE_GENERIC_METRIC"
    elif not bool(c.get("platform_assumption_current")) or not bool(c.get("metric_semantics_current")):
        state="STALE_PLATFORM_ASSUMPTION"
    elif not experiment_comparable:
        state="REBASELINE_COMPARABILITY"
    else:
        state="PLAYBOOK_READY"
    return {"state":state,"evidence_complete":evidence_complete,"format_valid":format_valid,"rights_valid":rights_valid,"metric_valid":metric_valid,"experiment_comparable":experiment_comparable}
