"""Original public GET representation selector; not a complete HTTP cache implementation."""
import json

def headers(h):
 if not isinstance(h,dict) or len(h)>8:raise ValueError('bounded single-field-line headers')
 result={}
 for k,v in h.items():
  if type(k)!=str or not k or not k.isascii() or not k.replace('-','').isalnum() or type(v)!=str or len(v)>128 or '\r' in v or '\n' in v:raise ValueError('small safe header strings')
  name=k.lower()
  if name in result:raise ValueError('duplicate normalized header name unsupported')
  result[name]=v.strip(' \t').lower() if name in ['accept-language','accept-encoding'] else v.strip(' \t')
 return result
def choose(records,url,request):
 req=headers(request)
 if type(url)!=str or not url.startswith('/public/') or len(url)>128 or not isinstance(records,list) or len(records)>8:raise ValueError('bounded public model')
 matches=[];trace=[]
 for rec in records:
  if rec.get('fresh',True) is not True or rec.get('storable',True) is not True or rec.get('public_get_permitted',True) is not True:trace.append({'id':rec['id'],'matched':False,'reason':'prevalidated reuse eligibility not met'});continue
  if rec['url']!=url:trace.append({'id':rec['id'],'matched':False,'reason':'different URI'});continue
  vary=rec['vary']
  if not isinstance(vary,list) or len(vary)>4 or any(type(x)!=str or not x for x in vary):raise ValueError('local Vary list')
  old=headers(rec['original_request']);names=[s.lower() for s in vary]
  if '*' in names:trace.append({'id':rec['id'],'matched':False,'reason':'Vary star always fails'});continue
  mismatch=[name for name in names if (name in req)!=(name in old) or req.get(name)!=old.get(name)]
  okay=not mismatch;trace.append({'id':rec['id'],'matched':okay,'reason':'all nominated fields match' if okay else 'mismatched '+','.join(mismatch)})
  if okay:matches.append(rec)
 winner=max(matches,key=lambda r:r['date_order']) if matches else None
 return {'selected_id':winner['id'] if winner else None,'selected_body':winner['body'] if winner else None,'trace':trace}
def demo():
 records=[{'id':1,'url':'/public/guide','original_request':{'Accept-Language':'fa'},'vary':['Accept-Language'],'date_order':1,'body':'authored Persian guide'},{'id':2,'url':'/public/guide','original_request':{'Accept-Language':'en'},'vary':['Accept-Language'],'date_order':2,'body':'authored English guide'},{'id':3,'url':'/public/guide','original_request':{},'vary':['Accept-Language'],'date_order':3,'body':'authored default absent preference'},{'id':4,'url':'/public/guide','original_request':{'Accept-Language':''},'vary':['Accept-Language'],'date_order':4,'body':'authored explicit empty preference'}]
 cases=[]
 for req,expected in [({'accept-language':' FA '},1),({'Accept-Language':'en'},2),({},3),({'accept-language':''},4),({'accept-language':'de'},None)]:
  row=choose(records,'/public/guide',req);assert row['selected_id']==expected;cases.append({'request':req,**row})
 # Independent literal normalized key table, not matcher output.
 expected_keys={(False,None):3,(True,''):4,(True,'fa'):1,(True,'en'):2}
 for row in cases:
  raw=row['request'];v=next(iter(raw.values())) if raw else None;key=(bool(raw),v.strip().lower() if v is not None else None);assert row['selected_id']==expected_keys.get(key)
 wrong_url_only_for_en=records[0]['body'];assert wrong_url_only_for_en!=cases[1]['selected_body']
 stale=choose([dict(records[0],fresh=False)],'/public/guide',{'Accept-Language':'fa'});assert stale['selected_id'] is None
 star=[dict(records[0],id=5,vary=['*'])];assert choose(star,'/public/guide',{'Accept-Language':'fa'})['selected_id'] is None
 multiple=records+[dict(records[0],id=6,date_order=6,body='authored Persian revised')];recent=choose(multiple,'/public/guide',{'Accept-Language':'fa'});assert recent['selected_id']==6
 dual=[dict(records[0],id=7,vary=['Accept-Language','X-Edition'],original_request={'Accept-Language':'fa','X-Edition':'A'})];assert choose(dual,'/public/guide',{'Accept-Language':'fa','X-Edition':'A'})['selected_id']==7 and choose(dual,'/public/guide',{'Accept-Language':'fa','X-Edition':'a'})['selected_id'] is None
 unrelated=choose(records,'/public/elsewhere',{});assert unrelated['selected_id'] is None
 rejects=[]
 for label,fn in [('duplicate_case',lambda:headers({'A':'x','a':'y'})),('crlf',lambda:headers({'A':'x\r\ny'})),('nonstring',lambda:headers({'A':1})),('header_budget',lambda:headers({'A':'x'*129})),('record_budget',lambda:choose(records*3,'/public/guide',{})),('not_public',lambda:choose(records,'/private/a',{}))]:
  try:fn()
  except ValueError:rejects.append(label)
  else:raise AssertionError(label)
 return {'independent_literal_variant_key_oracle_cases':len(cases),'wrong_URL_only_English_request_body':wrong_url_only_for_en,'matching_Vary_but_stale_precondition':stale,'stored_records':records,'five_request_cases':cases,'star_always_misses':choose(star,'/public/guide',{'Accept-Language':'fa'}),'most_recent_matching_date':recent,'two_vary_fields_case_sensitive_extension':dual,'different_uri':unrelated,'invalid_cases_rejected':rejects,'scope':'All entries prevalidated fresh/storable/public GET permitted. Date_order is prevalidated Date ordering, not a complete age parser. Fieldname casefold, known language/encoding value casefold+outer OWS only; no q ranking/reorder/full negotiation/fieldline combining/revalidation/networkserver. Absent and empty distinct; unknown fieldvalues exact-case. Vary is not authorization.'}
if __name__=='__main__':print(json.dumps(demo(),indent=2))
