#!/usr/bin/env python3
from pathlib import Path
import os,json,urllib.request,urllib.parse,datetime as dt
R=Path('/data/video-pipeline/HaTramAudio/project/031-Buoi-Dien-Cuoi-Truoc-Ngay-Tot-Nghiep')
S=json.loads((R/'log/postiz-schedule.json').read_text())
e=os.environ.copy();ep=Path.home()/'.config/ha-tram-audio/postiz.env';assert ep.exists()
for line in ep.read_text().splitlines():
 if '=' in line and not line.lstrip().startswith('#'):
  k,v=line.split('=',1);e.setdefault(k.strip(),v.strip().strip('"').strip("'"))
base=e['POSTIZ_BASE_URL'].rstrip('/');key=e['POSTIZ_API_KEY']
def get(path):
 req=urllib.request.Request(base+path,headers={'Authorization':key})
 return json.loads(urllib.request.urlopen(req,timeout=60).read())
def posts(x): return x.get('posts',x.get('data',[])) if isinstance(x,dict) else x
slot=S['slot_utc'];t=dt.datetime.fromisoformat(slot.replace('Z','+00:00'));q=posts(get('/posts?'+urllib.parse.urlencode({'startDate':(t-dt.timedelta(minutes=2)).isoformat().replace('+00:00','Z'),'endDate':(t+dt.timedelta(minutes=2)).isoformat().replace('+00:00','Z')})))
expected={iid:v['post_id'] for iid,v in S['posts'].items()};found={};duplicate_count=0
def iid(x):
 v=x.get('integration',x.get('integrationId',x.get('integration_id','')))
 return str(v.get('id','')) if isinstance(v,dict) else str(v)
def stamp(x): return x.get('publishDate') or x.get('date')
def same_slot(x):
 s=stamp(x)
 if not s:return False
 d=dt.datetime.fromisoformat(s.replace('Z','+00:00') if ('Z' in s or '+' in s) else s+'+00:00')
 return d.astimezone(dt.timezone.utc).replace(microsecond=0)==t.astimezone(dt.timezone.utc).replace(microsecond=0)
for integration_id,pid in expected.items():
 m=[x for x in q if x.get('id')==pid and iid(x)==integration_id and same_slot(x)]
 assert len(m)==1,(integration_id,pid,len(m)); state=m[0].get('status',m[0].get('state','QUEUE'));assert state in ('QUEUE','queued','scheduled','PUBLISHED')
 peers=[x for x in q if iid(x)==integration_id and same_slot(x) and x.get('state',x.get('status')) in ('QUEUE','queued','scheduled','PUBLISHED')]
 duplicate_count+=max(0,len(peers)-1);found[integration_id]={'post_id':pid,'state':state}
assert len([x for x in q if x.get('id') in expected.values()])==2 and duplicate_count==0
out={'schema_version':1,'project_id':'031','run_id':S['run_id'],'status':'calendar_verified','verified':True,'independent_get':True,'slot_utc':slot,'expected':expected,'found':found,'duplicate_count':duplicate_count,'verified_at':dt.datetime.now(dt.timezone.utc).isoformat()}
(R/'script/calendar-readback.json').write_text(json.dumps(out,ensure_ascii=False,indent=2)+'\n');print(json.dumps(out,ensure_ascii=False))
if __name__=='__main__': pass
