"""Original Clout planning calculator; no model, network or GPU execution.

Implements only the pose-string and frame-count rules documented by HY-WorldPlay
at revision 1588e1336e842b03b0a7860c654ebd7c46bb065e.
Its JSON output is an audit report, not a provider camera-trajectory input file.
"""

import argparse
import json
import re


def plan(pose, model, frames=None):
    segments = []
    latent = 1
    for raw in pose.split(","):
        match = re.fullmatch(r"(w|s|a|d|up|down|left|right)-([1-9][0-9]*)", raw.strip())
        if not match:
            raise ValueError("Use comma-separated action-positive_integer segments")
        action, count = match.group(1), int(match.group(2))
        if count > 4095 or latent + count > 4096:
            raise ValueError("This planning tool is limited to 4096 total latents")
        segments.append(
            {
                "action": action,
                "latents": count,
                "start_latent_inclusive": latent,
                "end_latent_exclusive": latent + count,
            }
        )
        latent += count
    required_frames = 4 * (latent - 1) + 1
    divisor = 16 if model == "bi" else 4
    if latent % divisor:
        raise ValueError(f"{model} requires total latents divisible by {divisor}; got {latent}")
    if frames is not None and frames != required_frames:
        raise ValueError(f"Pose needs {required_frames} frames; requested {frames}")
    return {
        "kind": "planning_only_not_model_input",
        "model_type": model,
        "pose": pose,
        "initial_latents": 1,
        "total_latents": latent,
        "required_frames": required_frames,
        "segments": segments,
        "not_verified": ["inference", "VRAM", "speed", "camera geometry", "visual continuity"],
    }


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--pose", default="w-15,s-15,right-1")
    parser.add_argument("--model", choices=("ar", "bi"), default="ar")
    parser.add_argument("--frames", type=int)
    args = parser.parse_args()
    try:
        result = plan(args.pose, args.model, args.frames)
    except ValueError as error:
        parser.error(str(error))
    print(json.dumps(result, indent=2))


if __name__ == "__main__":
    main()
