"""Optional foreground scheduler for an always-on owner host, never auto-started."""
import argparse
import json
import time
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
from rebalance_engine import QuantRiskRebalanceEngine, Rejected

NY=ZoneInfo('America/New_York')

def next_sunday_evening(now):
    if now.tzinfo is None:raise Rejected('Scheduler timestamp must include timezone')
    local=now.astimezone(NY)
    candidate=(local+timedelta(days=(6-local.weekday())%7)).replace(hour=19,minute=0,second=0,microsecond=0)
    if candidate<=local:candidate+=timedelta(days=7)
    return candidate

def run_once(db_path,config_out):
    try:
        result=QuantRiskRebalanceEngine(db_path,config_out).execute_dynamic_rebalance()
        print(json.dumps(result),flush=True);return 0
    except Rejected as exc:
        print(json.dumps({'status':'SCHEDULED_REBALANCE_BLOCKED','reason':str(exc)}),flush=True);return 1

def main():
    p=argparse.ArgumentParser(description=__doc__)
    p.add_argument('--db-path',required=True);p.add_argument('--config-out',required=True)
    p.add_argument('--once',action='store_true');args=p.parse_args()
    if args.once:return run_once(args.db_path,args.config_out)
    while True:
        due=next_sunday_evening(datetime.now(NY))
        print(json.dumps({'status':'WAITING','next_local_run':due.isoformat(),'requires_continuously_running_host':True}),flush=True)
        while datetime.now(NY)<due:time.sleep(min(60,max(0,(due-datetime.now(NY)).total_seconds())))
        run_once(args.db_path,args.config_out)

if __name__=='__main__':
    try:raise SystemExit(main())
    except KeyboardInterrupt:raise SystemExit(130)
