"""Visible deterministic rules for MKN-026 synthetic commerce-compliance boundary lab.
These rules validate evidence consistency only; they do not provide legal advice or a legal compliance conclusion.
"""
from __future__ import annotations

def inspect_case(f):
    issues=[]
    if not isinstance(f,dict) or f.get('evidence_kind')!='SYNTHETIC': return ['INPUT_INVALID']
    rows=f.get('rows') or []; decision=f.get('decision') or {}
    if not rows: issues.append('JURISDICTION_ROWS_MISSING')
    if decision.get('generic_compliance_boolean') is not None: issues.append('GENERIC_COMPLIANCE_BOOLEAN_FORBIDDEN')
    if decision.get('ai_legal_conclusion'): issues.append('AI_LEGAL_CONCLUSION_FORBIDDEN')
    for r in rows:
        required=['jurisdiction','claim_id','price_display_state','mandatory_fee_state','disclosure_id','disclosure_prominence','consent_purpose','consent_state','privacy_notice_ref','seller_role','marketplace_role','cancellation_path_ref','refund_policy_ref','policy_version','legal_basis_jurisdiction','review_state','effective_date','audit_event_id']
        for k in required:
            if r.get(k) in (None,'',[]): issues.append('MISSING_'+k.upper())
        if not r.get('claim_evidence_ref'): issues.append('CLAIM_EVIDENCE_MISSING')
        if r.get('mandatory_fee_state')=='ONLY_AT_FINAL_CHECKOUT' and r.get('disclosure_prominence') in {'STALE_FOR_NEW_BEHAVIOR','UNKNOWN','MISSING'}: issues.append('FEE_DISCLOSURE_EVIDENCE_MISMATCH')
        purposes=set(r.get('consent_purpose') or [])
        if 'MARKETING' in purposes and r.get('consent_state') not in {'PURPOSE_SCOPED','VALID_FOR_MARKETING','EXPLICIT_OPT_IN'}: issues.append('CONSENT_PURPOSE_EVIDENCE_MISMATCH')
        if r.get('seller_role')=='THIRD_PARTY' and r.get('exception_ref')=='ROLE_EVIDENCE_NOT_RECOMPUTED': issues.append('SELLER_ROLE_RECOMPUTATION_REQUIRED')
        if r.get('legal_basis_jurisdiction') and r.get('jurisdiction')!=r.get('legal_basis_jurisdiction'): issues.append('LEGAL_BASIS_JURISDICTION_MISMATCH')
        if str(r.get('policy_version','')).startswith('STALE:'): issues.append('POLICY_VERSION_STALE')
        if r.get('review_state') in {'OPEN','REVIEW_REQUIRED'} and not r.get('review_owner'): issues.append('REVIEW_OWNER_MISSING')
        if r.get('review_state')=='APPROVED' and not r.get('legal_basis_ref'): issues.append('APPROVAL_WITH_UNKNOWN_LEGAL_BASIS')
    return sorted(set(issues))

def expected_case(f):
    issues=inspect_case(f)
    if issues:
        if issues==['CLAIM_EVIDENCE_MISSING']: return 'INSUFFICIENT_EVIDENCE'
        return 'HOLD'
    rows=f.get('rows') or []
    if any(r.get('review_state') in {'OPEN','REVIEW_REQUIRED'} for r in rows): return 'REVIEW_REQUIRED'
    return 'RELEASE_INTERNAL_BOUNDARY'

def inspect_transfer(f):
    issues=[]; r=f.get('row') or {}
    if f.get('evidence_kind')!='SYNTHETIC': issues.append('TRANSFER_INPUT_INVALID')
    if f.get('baseline_decision_copied'): issues.append('BASELINE_DECISION_REUSE_FORBIDDEN')
    for k in ['jurisdiction','claim_evidence_ref','disclosure_id','privacy_notice_ref','seller_role','marketplace_role','cancellation_path_ref','refund_policy_ref','policy_version','legal_basis_ref','legal_basis_jurisdiction','review_owner','review_state','audit_event_id']:
        if r.get(k) in (None,'',[]): issues.append('TRANSFER_MISSING_'+k.upper())
    if r.get('seller_role')!='THIRD_PARTY' or r.get('marketplace_role')!='MARKETPLACE_INTERMEDIARY': issues.append('TRANSFER_ROLE_NOT_RECOMPUTED')
    if r.get('jurisdiction')!=r.get('legal_basis_jurisdiction'): issues.append('TRANSFER_LEGAL_BASIS_JURISDICTION_MISMATCH')
    if set(r.get('consent_purpose') or [])!={'FULFILLMENT','MARKETING_OPTIONAL'} or r.get('consent_state')!='PURPOSE_SCOPED': issues.append('TRANSFER_PRIVACY_PURPOSE_NOT_RECOMPUTED')
    return sorted(set(issues))

def expected_transfer(f):
    if inspect_transfer(f): return 'HOLD'
    return 'QUALIFIED_REVIEW_REQUIRED'
