import argparse
from datetime import datetime
from time import sleep

import zmq

parser = argparse.ArgumentParser(
    description='Request dark characterization. Will wait on data transfers to complete first!')  # noqa
parser.add_argument('--proposal', type=str,
                    help='The proposal number, without leading p, but with leading zeros')  # noqa
parser.add_argument('--instrument', type=str,
                    choices=["SPB", "MID", "FXE", "SCS", "DETLAB", "SQS", "HED", "CALLAB"],
                    help='The instrument')
parser.add_argument('--karabo-ids', type=str, nargs='*',
                    help='A list of karabo-id, default ["all"]',
                    default=['all'])
parser.add_argument('--karabo-das', type=str, nargs='*',
                    help='A list of karabo-da to process, default ["all"]',
                    default=['all'])

parser.add_argument('--cycle', type=str, help='The facility cycle')
parser.add_argument('--run-high', type=str,
                    help='Run number of high gain data as an integer')
parser.add_argument('--run-med', type=str,
                    help='Run number of medium gain data as an integer')
parser.add_argument('--run-low', type=str,
                    help='Run number of low gain data as an integer')
parser.add_argument('--run', type=str, help='Run number as an integer')

# default is to use configured reservations
parser.add_argument('--bkg', action='store_true',
                    help='Background mode: exit script after requesting dark.')

args = vars(parser.parse_args())

con = zmq.Context()
socket = con.socket(zmq.REQ)
con = socket.connect("tcp://max-exfl016:5555")

uuid = str(datetime.now().timestamp().as_integer_ratio()[0])

parm_list = ["dark", uuid, "SASEX", args["instrument"], args["cycle"],
             args["proposal"], ','.join(args["karabo_ids"]),
             ','.join(args["karabo_das"])]

if "run_high" in args and args["run_high"]:
    parm_list += ["(\"run-high\", \"{}\")".format(args["run_high"])]
if "run_med" in args and args["run_med"]:
    parm_list += ["(\"run-med\", \"{}\")".format(args["run_med"])]
if "run_low" in args and args["run_low"]:
    parm_list += ["(\"run-low\", \"{}\")".format(args["run_low"])]
if "run" in args and args["run"]:
    parm_list += ["(\"run\", \"{}\")".format(args["run"])]

msg = "','".join(parm_list)
socket.send("['{}']".format(msg).encode())
resp = socket.recv_multipart()[0]
print(resp.decode())
while True:
    socket.send("['query-rid', '{}']".format(uuid).encode())
    resp = socket.recv_multipart()[0]
    if args["bkg"]:
        break
    rl = resp.decode().split("\n")
    r = ["QUEUE" if "QUEUE" in r else r for r in rl]
    r = " | ".join(r)
    print(r + "\r", end=' ', flush=True)
    sleep(10)