#!/usr/bin/env python3
"""Create a reproducible provenance record for a frozen local music asset."""
from __future__ import annotations

import argparse
import hashlib
import json
import subprocess
from datetime import datetime, timezone
from pathlib import Path


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("media")
    parser.add_argument("output")
    parser.add_argument("--provider", required=True)
    parser.add_argument("--title", required=True)
    parser.add_argument("--creator", required=True)
    parser.add_argument("--source-page", required=True)
    parser.add_argument("--license", required=True)
    parser.add_argument("--license-url", required=True)
    parser.add_argument("--provider-id")
    parser.add_argument("--content-id-registered", action="store_true")
    args = parser.parse_args()

    media = Path(args.media).resolve()
    if not media.is_file():
        raise SystemExit(f"Music file does not exist: {media}")
    probe = subprocess.run(
        [
            "ffprobe", "-v", "error", "-show_streams", "-show_format",
            "-of", "json", str(media),
        ],
        capture_output=True,
        text=True,
        check=True,
    )
    metadata = json.loads(probe.stdout)
    audio = next(
        (stream for stream in metadata["streams"] if stream.get("codec_type") == "audio"),
        None,
    )
    if audio is None:
        raise SystemExit("The registered asset has no audio stream")
    record = {
        "local_path": str(media),
        "provider": args.provider,
        "provider_id": args.provider_id,
        "title": args.title,
        "creator": args.creator,
        "source_page": args.source_page,
        "license": args.license,
        "license_url": args.license_url,
        "content_id_registered": args.content_id_registered,
        "downloaded_at": datetime.now(timezone.utc).isoformat(),
        "sha256": hashlib.sha256(media.read_bytes()).hexdigest(),
        "bytes": media.stat().st_size,
        "duration": float(metadata["format"]["duration"]),
        "codec": audio.get("codec_name"),
        "sample_rate": int(audio.get("sample_rate") or 0),
        "channels": int(audio.get("channels") or 0),
        "usage_warning": (
            "The provider marks this track as Content ID registered; keep the "
            "source and license record for possible automated claim review."
            if args.content_id_registered
            else None
        ),
    }
    output = Path(args.output)
    output.write_text(
        json.dumps(record, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    print(json.dumps({"output": str(output.resolve()), "status": "ok"}))


if __name__ == "__main__":
    main()
