#!/usr/bin/env python3
"""Create an immutable new prompt version by copying the current one."""

from __future__ import annotations

import argparse
import json
import shutil
from datetime import date
from pathlib import Path


PROMPTS_DIR = Path(__file__).resolve().parent
MANIFEST_PATH = PROMPTS_DIR / "manifest.json"


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="Create a new screenplay prompt version.")
    parser.add_argument(
        "--from-version",
        default=None,
        help="Source version to copy. Defaults to manifest current_version.",
    )
    parser.add_argument(
        "--description",
        required=True,
        help="Short description for the new prompt version.",
    )
    parser.add_argument(
        "--set-current",
        action="store_true",
        help="Set the newly created version as current_version in the manifest.",
    )
    return parser.parse_args()


def load_manifest() -> dict:
    return json.loads(MANIFEST_PATH.read_text(encoding="utf-8"))


def next_version_name(versions: dict) -> str:
    highest = 0
    for name in versions:
        if name.startswith("v") and name[1:].isdigit():
            highest = max(highest, int(name[1:]))
    return f"v{highest + 1}"


def main() -> int:
    args = parse_args()
    manifest = load_manifest()
    versions = manifest["versions"]
    source_version = args.from_version or manifest["current_version"]
    if source_version not in versions:
        raise SystemExit(f"Unknown source version: {source_version}")

    new_version = next_version_name(versions)
    source_path = PROMPTS_DIR / versions[source_version]["path"]
    target_relpath = f"versions/{new_version}"
    target_path = PROMPTS_DIR / target_relpath

    if target_path.exists():
        raise SystemExit(f"Target version already exists: {target_path}")

    shutil.copytree(source_path, target_path)

    versions[new_version] = {
        "path": target_relpath,
        "description": args.description,
        "copied_from": source_version,
        "created_at": str(date.today()),
    }

    if args.set_current:
        manifest["current_version"] = new_version

    MANIFEST_PATH.write_text(
        json.dumps(manifest, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    print(new_version)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
