"""Capture using the public SDK. Replace paths and serial for your machine."""
from pathlib import Path
import argparse
from stereo_camera_python import Camera, StereoRuntimeError, list_devices


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--installation-root")
    parser.add_argument("--serial")
    parser.add_argument("--calibration")
    parser.add_argument("--config-root")
    parser.add_argument("--output", type=Path)
    parser.add_argument("--backend", choices=("auto", "cpu", "cuda", "dml"), default="auto")
    parser.add_argument("--profile", choices=("auto", "quarter", "half", "full"), default="quarter")
    parser.add_argument("--without-depth", action="store_true")
    parser.add_argument("--timeout-ms", type=int, default=5000)
    args = parser.parse_args()
    if not args.serial:
        for device in list_devices(installation_root=args.installation_root):
            print(device.to_dict())
        return
    try:
        with Camera.open(args.serial, installation_root=args.installation_root,
                         config_root=args.config_root, calibration=args.calibration,
                         backend=args.backend, profile=args.profile) as camera:
            result = camera.capture(with_depth=not args.without_depth, timeout_ms=args.timeout_ms)
            print("left/right:", result.left.shape, result.right.shape)
            print("disparity:", None if result.disparity is None else (result.disparity.dtype, result.disparity.shape))
            print("depth_m:", None if result.depth_m is None else (result.depth_m.dtype, result.depth_m.shape))
            print("session:", result.metadata.get("inference_session"))
            print("saved:", result.save(args.output))
            if result.metadata.get("depth_processing_error"):
                raise RuntimeError(result.metadata["depth_processing_error"])
    except StereoRuntimeError as error:
        print("SDK error:", error.code, str(error))
        raise


if __name__ == "__main__":
    main()
