import argparse, json, os, signal, socket, sys, time
from pathlib import Path

ap=argparse.ArgumentParser()
ap.add_argument('--state-dir',required=True)
ap.add_argument('--ready-delay-ms',type=int,default=0)
ap.add_argument('--stop-delay-ms',type=int,default=0)
ap.add_argument('--umask',default='0022')
args=ap.parse_args()
state=Path(args.state_dir); state.mkdir(parents=True,exist_ok=True)
mask=int(args.umask,8)
old=os.umask(mask)
try:
    created=state/'created.txt'
    fd=os.open(created,os.O_WRONLY|os.O_CREAT|os.O_TRUNC,0o666)
    os.write(fd,b'fixture\n'); os.close(fd)
finally:
    os.umask(old)

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('127.0.0.1',0)); sock.listen(1)
port=sock.getsockname()[1]
startup={
  'pid':os.getpid(),'uid':os.geteuid(),'gid':os.getegid(),'groups':os.getgroups(),
  'cwd':os.getcwd(),'state_dir':str(state),'env_state_dir':os.environ.get('OPS001_STATE_DIR'),
  'created_mode':oct(created.stat().st_mode & 0o777),'socket_host':'127.0.0.1','socket_port':port,
  'umask':args.umask
}
(state/'startup.json').write_text(json.dumps(startup,indent=2),encoding='utf-8')

def stop(signum,frame):
    time.sleep(args.stop_delay_ms/1000)
    (state/'cleanup.json').write_text(json.dumps({'signal':'SIGTERM','cleanup':True}),encoding='utf-8')
    sock.close(); raise SystemExit(0)
signal.signal(signal.SIGTERM,stop)
time.sleep(args.ready_delay_ms/1000)
(state/'ready.json').write_text(json.dumps({'ready':True}),encoding='utf-8')
while True: time.sleep(0.05)
