"""Controlled end-to-end delivery: inspect/configure/add/start/wait/verify separately.

One explicit stage per invocation. No implicit resume, retries, queue purge or
'newest file' search. Record the returned JobId; a missing receipt is NOT permission
to AddRenderJob again. Review Deliver and the created job before the next stage.
"""
import argparse
from resolve_api_connection import connect
import resolve_api_delivery as delivery
import resolve_api_queue as queue
import verify_render_output as verification


def main():
    p=argparse.ArgumentParser(description=__doc__)
    sub=p.add_subparsers(dest='step')
    inspect=sub.add_parser('inspect'); inspect.add_argument('--project-id')
    configure=sub.add_parser('configure',help='Select entire timeline only; other settings remain unchanged')
    delivery.cli_write(configure)
    for name in ('add','start'):
        step=sub.add_parser(name); queue.cli_write(step,name)
    wait=sub.add_parser('wait'); wait.add_argument('--project-id',required=True)
    wait.add_argument('--job-id',required=True); wait.add_argument('--timeout',type=float,default=120)
    wait.add_argument('--interval',type=float,default=1); wait.add_argument('--max-polls',type=int,default=600)
    verify=sub.add_parser('verify'); verification.add_arguments(verify)
    a=p.parse_args()
    if a.step == 'verify': return delivery.print_result(lambda:verification.from_args(a))
    if a.step == 'configure':
        return delivery.print_result(lambda:delivery.apply_settings(connect(),mode='entire',**delivery.cli_flags(a)))
    if a.step in ('add','start'):
        return queue.print_result(lambda:queue.write_from_args(connect(),a.step,a))
    if a.step == 'wait':
        return queue.print_result(lambda:queue.wait_job(connect(),a.project_id,a.job_id,
                       timeout=a.timeout,interval=a.interval,max_polls=a.max_polls))
    return queue.print_result(lambda:queue.inspect_queue(connect(),getattr(a,'project_id',None),details=True))


if __name__ == "__main__":
    raise SystemExit(main())
