#!/usr/bin/env python3
from __future__ import annotations

import argparse
import json
import subprocess
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
OUTPUT = ROOT / 'docs/internal/benchmark-metadata.md'
VIDEOS = [
    ROOT / 'materials/source-media/2026-03-26_test-video.mp4',
    ROOT / 'materials/source-media/official-totally-spies-season-7-trailer.mp4',
]


def ffprobe(path: Path) -> dict:
    result = subprocess.run(
        [
            'ffprobe',
            '-v', 'error',
            '-show_entries',
            'stream=codec_name,width,height,r_frame_rate,nb_frames:format=filename,duration,size,bit_rate',
            '-of', 'json',
            str(path),
        ],
        check=True,
        capture_output=True,
        text=True,
    )
    return json.loads(result.stdout)


def fps(value: str) -> str:
    if '/' not in value:
        return value
    num, den = value.split('/', 1)
    if den == '0':
        return value
    return f'{float(num) / float(den):.2f}'


def render(entries: list[tuple[Path, dict]]) -> str:
    lines = ['# Benchmark metadata', '']
    for path, payload in entries:
        stream = payload['streams'][0]
        fmt = payload['format']
        lines.extend([
            f'## {path.name}',
            '',
            f'- path: `{path}`',
            f'- codec: `{stream.get("codec_name", "")}`',
            f'- resolution: `{stream.get("width", "")}x{stream.get("height", "")}`',
            f'- frame rate: `{fps(stream.get("r_frame_rate", ""))}` fps',
            f'- duration: `{float(fmt.get("duration", 0.0)):.2f}` seconds',
            f'- frames: `{stream.get("nb_frames", "")}`',
            f'- size: `{fmt.get("size", "")}` bytes',
            f'- bitrate: `{fmt.get("bit_rate", "")}`',
            '',
        ])
    return '\n'.join(lines)


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument('--check', action='store_true')
    args = parser.parse_args()

    entries = []
    for video in VIDEOS:
        if not video.exists():
            raise SystemExit(f'Missing video: {video}')
        entries.append((video, ffprobe(video)))

    if args.check:
        print('OK:', ', '.join(video.name for video, _ in entries))
        return

    OUTPUT.parent.mkdir(parents=True, exist_ok=True)
    OUTPUT.write_text(render(entries) + '\n', encoding='utf-8')
    print(f'Wrote {OUTPUT}')


if __name__ == '__main__':
    main()
