def evaluate(c):
    decisive=['config_session_id','product_id','plan_id','price_id','pricing_model','billing_period','quantity_dimension','price_version','handoff_ref','owner']
    if any(not c.get(k) for k in decisive) or not c.get('evidence_ref'):
        return _out('BLOCKED_EVIDENCE_MISSING','MISSING','UNKNOWN','UNKNOWN','BLOCKED','DECISIVE_EVIDENCE_MISSING')
    if not c.get('labels_present') or not c.get('feedback_identifiable'):
        return _out('HOLD_ACCESSIBILITY','VALID','PASS','READY','PARTIAL','ACCESSIBILITY_EVIDENCE_INCOMPLETE')
    if not c.get('incompatibility_ok'):
        return _out('INVALID_INCOMPATIBILITY','VALID','FAIL','READY','PRESENT','INCOMPATIBLE_OPTIONS')
    if not c.get('dependency_ok'):
        return _out('INVALID_DEPENDENCY','VALID','FAIL','READY','PRESENT','DEPENDENCY_RULE_FAILED')
    if c.get('eligibility') != 'ELIGIBLE':
        return _out('HOLD_ELIGIBILITY_UNKNOWN','VALID','PASS','HOLD','PRESENT','ELIGIBILITY_NOT_PROVEN')
    if c.get('quote_required'):
        return _out('QUOTE_REQUIRED','QUOTE','PASS','READY','PRESENT','HUMAN_QUOTE_REQUIRED')
    if not c.get('price_active'):
        if c.get('historical_price_snapshot') and c.get('price_valid_at_submission'):
            return _out('HISTORICAL_RECONSTRUCTED','HISTORICAL_VALID','PASS','READY','PRESENT','ARCHIVED_PRICE_VALID_FOR_HISTORICAL_SUBMISSION')
        return _out('HOLD_PRICE_STALE','ARCHIVED','PASS','READY','PRESENT','ARCHIVED_PRICE_NOT_VALID_FOR_NEW_SELECTION')
    if not c.get('displayed_total_matches_version'):
        return _out('HOLD_PRICE_VERSION_MISMATCH','VERSION_MISMATCH','PASS','READY','PRESENT','CACHED_TOTAL_DOES_NOT_MATCH_PRICE_VERSION')
    return _out('ACCEPT','CURRENT','PASS','READY','PRESENT','CONFIGURATION_RECONSTRUCTABLE')

def _out(state,price,dependency,eligibility,intent,reason):
    return {'validation_state':state,'price_state':price,'dependency_state':dependency,'eligibility_state':eligibility,'intent_state':intent,'reason_code':reason}
