import json
from pathlib import Path

from autoshorts.preview_renderer import (
    build_preview_frames,
    render_preview_video,
    write_frame_images,
)


def _manifest() -> dict:
    path = Path("data/render_manifests/testbatch_002_top3/ai-004-stop-asking-ai-to-think-for-you.json")
    return json.loads(path.read_text(encoding="utf-8"))


def test_build_preview_frames_creates_one_frame_per_visual_scene():
    manifest = _manifest()

    frames = build_preview_frames(manifest, width=540, height=960)

    visual_count = sum(1 for item in manifest["timeline"] if item["track"] == "visual")
    assert len(frames) == visual_count
    assert frames[0]["scene_id"] == "scene_01"
    assert frames[0]["start_ms"] == 0
    assert frames[0]["duration_ms"] > 0
    assert frames[0]["image"].size == (540, 960)
    assert frames[0]["text"] == manifest["timeline"][0]["text"]


def test_preview_frames_keep_main_text_readable_and_consistent():
    manifest = _manifest()

    frames = build_preview_frames(manifest, width=540, height=960)

    main_sizes = [frame["typography"]["main_font_size"] for frame in frames]
    retention_sizes = [frame["typography"]["retention_font_size"] for frame in frames]
    assert min(main_sizes) >= 34
    assert max(main_sizes) - min(main_sizes) <= 8
    assert min(retention_sizes) >= 22
    assert all(frame["typography"]["main_line_count"] <= 4 for frame in frames)
    assert all(frame["typography"]["retention_line_count"] <= 3 for frame in frames)


def test_write_frame_images_outputs_png_contact_sheet_inputs(tmp_path):
    manifest = _manifest()
    frames = build_preview_frames(manifest, width=270, height=480)

    paths = write_frame_images(frames, tmp_path)

    assert len(paths) == 5
    assert all(path.suffix == ".png" for path in paths)
    assert paths[0].read_bytes().startswith(b"\x89PNG")


def test_render_preview_video_writes_mp4_with_ffmpeg(tmp_path):
    manifest = _manifest()

    result = render_preview_video(manifest, tmp_path / "preview.mp4", width=270, height=480, fps=12)

    assert result["output_path"].suffix == ".mp4"
    assert result["output_path"].exists()
    assert result["output_path"].stat().st_size > 1000
    assert result["frame_count"] == 5
