import argparse
import pexpect, time, sys
import os, errno
import base64

def main(timeout_bazel, duration, num_cameras):

    # run cammux and logger
    params = "vehicle/launch/vehicle_params_launch"
    zcore = "vehicle/launch/zcore_launch"
    logger = "bin/zlog"
    cameras = "production/cameras/framegrabber_bringup/cammux_jig/cameras_launch"

    params_process = pexpect.spawn(params, logfile=sys.stdout)
    params_process.expect("started core service", timeout=timeout_bazel)
    zcore_process = pexpect.spawn(zcore, logfile=sys.stdout)
    zcore_process.expect("core service.*found", timeout=timeout_bazel)

    cameras_process = pexpect.spawn(cameras, logfile=sys.stdout)
    for i in range(num_cameras):
        cameras_process.expect("INITIALIZED", timeout=timeout_bazel)

    logger_process = pexpect.spawn(logger, logfile=sys.stdout)
    logger_process.expect("Who is the software operator?", timeout=timeout_bazel)
    logger_process.sendline("zoox")
    logger_process.expect("Who is the safety driver?")
    logger_process.sendline("zoox")
    logger_process.expect("passenger?")
    logger_process.sendline("")
    logger_process.expect_exact('(1-20): ')
    logger_process.sendline("1")
    logger_process.expect_exact('Description of test? (e.g. CLAMS run)')
    logger_process.sendline("Framegrabber test")

    timeout = time.time() + duration;
    while time.time() < timeout:
        try:
            logger_process.expect_exact('Logger is running', timeout=10)
        except:
            pass;

    logger_process.terminate()
    cameras_process.terminate()
    zcore_process.terminate()
    params_process.terminate()

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--timeout", required=True, help="Timeout for waiting on bazel commands in seconds")
    parser.add_argument("--duration", required=True, help="Length of time to run the camera test in seconds")
    parser.add_argument("--num_cameras", required=True, help="Number of cameras")
    args = parser.parse_args()
    main(int(args.timeout), int(args.duration), int(args.num_cameras))
