import argparse
import json
from pathlib import Path


SCRIPT_DIR = Path(__file__).resolve().parent
DEFAULT_INPUT_FILE = SCRIPT_DIR / "servo_config.yaml"
DEFAULT_OUTPUT_FILE = SCRIPT_DIR / "servo_config.json"


def parse_args():
    parser = argparse.ArgumentParser(description="Convert a servo YAML config to JSON.")
    parser.add_argument("input", nargs="?", type=Path, default=DEFAULT_INPUT_FILE)
    parser.add_argument("output", nargs="?", type=Path, default=DEFAULT_OUTPUT_FILE)
    return parser.parse_args()


def convert_yaml_to_json(input_file, output_file):
    try:
        import yaml
    except ModuleNotFoundError as exc:
        raise RuntimeError(
            "PyYAML is required. Install it with: python -m pip install PyYAML"
        ) from exc

    input_file = Path(input_file).resolve()
    output_file = Path(output_file).resolve()

    with input_file.open("r", encoding="utf-8") as stream:
        data = yaml.safe_load(stream)

    if not isinstance(data, dict):
        raise ValueError("Servo config root must be a YAML mapping.")

    # These helper nodes only exist to support YAML anchors and merge keys.
    data.pop("default_driver", None)
    data.pop("default_control", None)

    output_file.parent.mkdir(parents=True, exist_ok=True)
    with output_file.open("w", encoding="utf-8") as stream:
        json.dump(data, stream, indent=2, ensure_ascii=False)
        stream.write("\n")

    return output_file


def main():
    args = parse_args()
    try:
        output_file = convert_yaml_to_json(args.input, args.output)
    except Exception as exc:
        raise SystemExit(f"YAML conversion failed: {exc}") from exc
    print(f"Generated {output_file}")


if __name__ == "__main__":
    main()
