import json,sys
from pathlib import Path
ROOT=Path(__file__).resolve().parent
FIXTURE=json.loads((ROOT/'fixture.json').read_text())
def finish(mode,observations,conditions):
 checks=[name for name,ok in conditions.items() if ok]
 failed=[name for name,ok in conditions.items() if not ok]
 print(json.dumps({'mode':mode,'status':'check_failed' if failed else 'passed','checks':checks,'failed_checks':failed,'error':', '.join(failed),'observations':observations},sort_keys=True))
 sys.exit(2 if failed else 0)
from datetime import datetime,timezone
from zoneinfo import ZoneInfo
mode=sys.argv[1] if len(sys.argv)>1 else 'fixed'
assert mode in ('broken','fixed','replace-with-utc')
with (ROOT/'America-New_York.tzif').open('rb') as f:zone=ZoneInfo.from_file(f,key='America/New_York')
observed=[];conditions={}
for row in FIXTURE:
 a=datetime(*row['start'],tzinfo=zone,fold=row['fold_start']);b=datetime(*row['end'],tzinfo=zone,fold=row['fold_end'])
 if mode=='fixed':delta=b.astimezone(timezone.utc)-a.astimezone(timezone.utc)
 elif mode=='replace-with-utc':delta=b.replace(tzinfo=timezone.utc)-a.replace(tzinfo=timezone.utc)
 else:delta=b-a
 seconds=delta.total_seconds()
 observed.append({'name':row['name'],'start':a.isoformat(),'end':b.isoformat(),'fold_start':a.fold,'fold_end':b.fold,'start_utc':a.astimezone(timezone.utc).isoformat(),'end_utc':b.astimezone(timezone.utc).isoformat(),'wall_seconds':(b-a).total_seconds(),'calculated_elapsed_seconds':seconds,'expected_elapsed_seconds':row['elapsed_seconds']})
 conditions[row['name']+'_elapsed_matches_utc_timeline']=seconds==row['elapsed_seconds']
finish(mode,observed,conditions)
