"""Synthetic health and notification demonstration, bound to loopback only."""
from http.server import ThreadingHTTPServer,BaseHTTPRequestHandler
from threading import Thread
from urllib.request import Request,build_opener,ProxyHandler
from urllib.error import HTTPError
from datetime import datetime,timezone
from pathlib import Path
import json
state={'health':200,'sink':204,'jobFresh':True,'received':[]}
class Handler(BaseHTTPRequestHandler):
 def log_message(self,*args):pass
 def do_GET(self):
  status=state['health'] if self.path=='/health' else (200 if state['jobFresh'] else 503)
  self.send_response(status);self.end_headers();self.wfile.write(b'synthetic')
 def do_POST(self):
  event=json.loads(self.rfile.read(int(self.headers['Content-Length'])))
  if state['sink']==204:state['received'].append(event)
  self.send_response(state['sink']);self.end_headers()
server=ThreadingHTTPServer(('127.0.0.1',0),Handler)
thread=Thread(target=server.serve_forever,daemon=True);thread.start()
base=f'http://127.0.0.1:{server.server_address[1]}'
client=build_opener(ProxyHandler({}))
def req(path,data=None):
 try:
  with client.open(Request(base+path,data=None if data is None else json.dumps(data).encode(),headers={'Content-Type':'application/json'}),timeout=2) as r:return r.status
 except HTTPError as e:return e.code
rows=[]
def observe(label):
 health=req('/health');fresh=req('/job-freshness');event='problem' if health!=200 or fresh!=200 else 'healthy'
 before=len(state['received']);delivery=req('/notification',{'event':event,'label':label})
 rows.append({'scenario':label,'healthStatus':health,'jobStatus':fresh,'notificationStatus':delivery,'acceptedByLocalStub':len(state['received'])-before,'humanAcknowledged':False})
try:
 observe('normal')
 state['health']=503;observe('health-failure')
 state['sink']=503;observe('notification-failure')
 state['health']=200;state['sink']=204;state['jobFresh']=False;observe('job-stale-but-http-healthy')
 state['jobFresh']=True;observe('recovered')
 assert [(r['healthStatus'],r['jobStatus'],r['notificationStatus'],r['acceptedByLocalStub']) for r in rows]==[(200,200,204,1),(503,200,204,1),(503,200,503,0),(200,503,204,1),(200,200,204,1)]
 report={'checkedAt':datetime.now(timezone.utc).isoformat(),'scope':'Loopback only. Synthetic health/job freshness and notification receiver; no external message or human acknowledgement. Each observation sends once; not a production monitor.','rows':rows,'acceptedEvents':state['received'],'assertionsPassed':5}
 Path(__file__).with_name('report.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n')
 print(json.dumps(report,ensure_ascii=False,indent=2))
finally:server.shutdown();server.server_close();thread.join()
