#!/usr/bin/env python3
import hashlib,json,os
from datetime import datetime,timedelta,timezone
from pathlib import Path
from zoneinfo import ZoneInfo
import requests
P='gacmai_20260716_233054';ROOT=Path('/data/video-pipeline/GacMaiAudio/project')/P;ART=ROOT/'artifacts'
Y='cmriltjyk0013j7c8l7dp3o5i';F='cmrilrryn0011j7c8kfzgx9zq';TARGETS={Y:'youtube',F:'facebook'}
TZ=ZoneInfo('Asia/Ho_Chi_Minh');SLOTS=((9,20),(19,0));BASE=os.environ['POSTIZ_BASE_URL'].rstrip('/');HEAD={'Authorization':os.environ['POSTIZ_API_KEY']}
def get(path,**kw):
 r=requests.get(BASE+path,headers=HEAD,timeout=60,**kw);r.raise_for_status();return r.json()
def inst(s):return datetime.fromisoformat(s.replace('Z','+00:00')).astimezone(timezone.utc)
now=datetime.now(TZ);end=now+timedelta(days=14);body=get('/posts',params={'startDate':now.isoformat(),'endDate':end.isoformat()});posts=body.get('posts',body if isinstance(body,list) else [])
if not isinstance(posts,list):raise SystemExit('unexpected posts schema')
ints=get('/integrations');ints=ints if isinstance(ints,list) else ints.get('integrations',ints.get('data',[]));by={x.get('id'):x for x in ints};ie={}
for iid,provider in TARGETS.items():
 x=by.get(iid)
 if not x or x.get('disabled'):raise SystemExit(f'integration unavailable {iid}')
 ie[iid]={'provider':provider,'name':x.get('name'),'disabled':bool(x.get('disabled',False))}
target=[p for p in posts if (p.get('integration') or {}).get('id') in TARGETS];ev=[];chosen=None
for off in range(14):
 day=(now+timedelta(days=off)).date()
 for h,m in SLOTS:
  c=datetime(day.year,day.month,day.day,h,m,tzinfo=TZ)
  if c<=now:continue
  u=c.astimezone(timezone.utc);busy=[]
  for p in target:
   if p.get('publishDate') and inst(p['publishDate'])==u:busy.append((p.get('integration') or {}).get('id'))
  ev.append({'local':c.isoformat(),'utc':u.isoformat().replace('+00:00','Z'),'busy_integration_ids':sorted(set(busy))})
  if not busy and chosen is None:chosen=ev[-1]
 if chosen:break
if not chosen:raise SystemExit('no common slot')
out={'status':'passed','project_id':P,'read_only':True,'create_or_upload_calls':0,'timezone':'Asia/Ho_Chi_Minh','canonical_slots':['09:20','19:00'],'checked_at_local':now.isoformat(),'range_end_local':end.isoformat(),'api_post_count':len(posts),'target_match_count':len(target),'integrations':ie,'candidates':ev,'chosen':chosen};path=ART/'postiz_live_calendar_evidence.json';path.write_text(json.dumps(out,ensure_ascii=False,indent=2)+'\n');print(json.dumps(out,ensure_ascii=False))
