@final
class CLI:
    """Command-line interface for the Electrophysiology Manipulator Link.
    Configures the CLI parser and options.
    """
    def __init__(self) -> None:
        """Initialize CLI parser."""
        self._parser = ArgumentParser(
            description="Electrophysiology Manipulator Link: a Socket.IO interface for manipulators in electrophysiology experiments.",
            prog="python -m ephys-link",
        )
        _ = self._parser.add_argument(
            "-b", "--background", dest="background", action="store_true", help="Skip configuration window."
        )
        _ = self._parser.add_argument(
            "-i",
            "--ignore-updates",
            dest="ignore_updates",
            action="store_true",
            help="Skip (ignore) checking for updates.",
        )
        _ = self._parser.add_argument(
            "-t",
            "--type",
            type=str,
            dest="type",
            default="ump",
            help='Manipulator type ("ump", "pathfinder-mpm", "parallax", "fake"). Default: "ump".',
        )
        _ = self._parser.add_argument(
            "-d",
            "--debug",
            dest="debug",
            action="store_true",
            help="Enable debug mode.",
        )
        _ = self._parser.add_argument(
            "-p",
            "--use-proxy",
            dest="use_proxy",
            action="store_true",
            help="Enable proxy mode.",
        )
        _ = self._parser.add_argument(
            "-a",
            "--proxy-address",
            type=str,
            default="proxy2.virtualbrainlab.org",
            dest="proxy_address",
            help="Proxy IP address.",
        )
        _ = self._parser.add_argument(
            "--mpm-port",
            type=int,
            default=8080,
            dest="mpm_port",
            help="HTTP port New Scale Pathfinder MPM's server is on. Default: 8080.",
        )
        _ = self._parser.add_argument(
            "--parallax-port",
            type=int,
            default=8081,
            dest="parallax_port",
            help="HTTP port Parallax's server is on. Default: 8081.",
        )
        _ = self._parser.add_argument(
            "-s",
            "--serial",
            type=str,
            default="no-e-stop",
            dest="serial",
            nargs="?",
            help="Emergency stop serial port (i.e. COM3). Default: disables emergency stop.",
        )
        _ = self._parser.add_argument(
            "-v",
            "--version",
            action="version",
            version=f"Electrophysiology Manipulator Link v{version}",
            help="Print version and exit.",
        )
    def parse_args(self) -> EphysLinkOptions:
        """Parse arguments and return them
        Returns:
            Parsed arguments
        """
        return EphysLinkOptions(**vars(self._parser.parse_args()))  # pyright: ignore [reportAny]