"""Offline CRM sync; fake transport, no sockets, sleep or credentials."""
import json,hashlib
from pathlib import Path
ROOT=Path(__file__).resolve().parent
class TimeoutAfterCommit(Exception):pass
class FakeCRM:
 def __init__(self):self.rows={};self.calls=[];self.counts={}
 def put(self,event):
  key=event['id'];n=self.counts.get(key,0)+1;self.counts[key]=n;self.calls.append({'id':key,'attempt':n})
  if key=='retry-rate' and n==1:return 429,{'retry_after':2}
  if key=='retry-server' and n<3:return 503,{}
  if key=='dead':return 503,{}
  old=self.rows.get(event['lead'])
  if old and old['version']>=event['version']:return 200,{'result':'stale_or_duplicate'}
  self.rows[event['lead']]={'version':event['version'],'product':event['product'],'quantity':event['quantity']}
  if key=='lost-ack' and n==1:raise TimeoutAfterCommit()
  return 200,{'result':'upserted'}
def replay(pages,crm=None):
 crm=crm or FakeCRM();seen={};log=[];quarantine=[];delays=[]
 for page in pages:
  for event in page['events']:
   if not isinstance(event,dict) or any(k not in event for k in ['id','lead','version','product','quantity']) or any(not isinstance(event.get(k),str) or not event[k] for k in ['id','lead','product']) or type(event.get('quantity')) is not int or event['quantity']<=0 or type(event.get('version')) is not int or event['version']<=0:
    quarantine.append({'event':event,'reason':'invalid_schema'});continue
   digest=hashlib.sha256(json.dumps(event,sort_keys=True).encode()).hexdigest()
   if event['id'] in seen:
    if seen[event['id']]==digest:log.append({'id':event['id'],'result':'duplicate_event'});continue
    quarantine.append({'event':event,'reason':'conflicting_event_id'});continue
   success=False
   for attempt in range(1,4):
    try:status,body=crm.put(event)
    except TimeoutAfterCommit:status,body=504,{}
    log.append({'id':event['id'],'attempt':attempt,'status':status,**body})
    if status==200:seen[event['id']]=digest;success=True;break
    if status not in [429,503,504]:break
    if attempt<3:delays.append({'id':event['id'],'seconds':body.get('retry_after',2**(attempt-1)),'simulated':True})
   if not success:quarantine.append({'event':event,'reason':'retry_exhausted'})
 return {'crm':crm.rows,'calls':crm.calls,'audit':log,'quarantine':quarantine,'delays':delays,'network_calls':0}
if __name__=='__main__':
 report=replay(json.loads((ROOT/'events.json').read_text()));(ROOT/'output.json').write_text(json.dumps(report,ensure_ascii=False,indent=2));print(json.dumps({'leads':len(report['crm']),'quarantine':len(report['quarantine']),'network_calls':0}))
