from __future__ import annotations

from pathlib import Path

import previewer


def test_preview_rule_classifies_common_documents() -> None:
    assert previewer.preview_rule("pdf")["kind"] == "pdf"
    assert previewer.preview_rule(".xlsx")["kind"] == "sheet"
    assert previewer.preview_rule("docx")["kind"] == "doc"
    assert previewer.preview_rule("zip")["kind"] == "archive"
    assert previewer.preview_rule("png")["kind"] == "image"


def test_preview_card_is_sandboxed(tmp_path: Path) -> None:
    invoice = tmp_path / "invoice.pdf"
    invoice.write_bytes(b"%PDF test")
    card = previewer.preview_card_for_path(str(tmp_path), "invoice.pdf")
    assert card["ok"] is True
    assert card["kind"] == "pdf"
    assert card["exists"] is True
    assert card["dataUri"].startswith("data:image/svg+xml;base64,")

    blocked = previewer.preview_card_for_path(str(tmp_path), "../secret.pdf")
    assert blocked["ok"] is False


def test_preview_batch_limits_files(tmp_path: Path) -> None:
    for name in ("a.pdf", "b.xlsx", "c.zip"):
        (tmp_path / name).write_text("x", encoding="utf-8")
    result = previewer.preview_batch(root=str(tmp_path), paths=["a.pdf", "b.xlsx", "c.zip"], max_files=2)
    assert result["count"] == 2
    assert result["truncated"] is True
    assert [card["kind"] for card in result["cards"]] == ["pdf", "sheet"]


def test_text_thumbnail_contains_file_content(tmp_path: Path) -> None:
    sample = tmp_path / "costs.csv"
    sample.write_text("supplier,total\nOpenAI,20.00\n", encoding="utf-8")
    result = previewer.thumbnail_for_path(str(tmp_path), "costs.csv")
    assert result["ok"] is True
    assert result["mime"] == "image/svg+xml"
    thumb = Path(result["thumbnail"])
    assert thumb.is_file()
    svg = thumb.read_text(encoding="utf-8")
    assert 'width="576"' in svg
    assert 'height="432"' in svg
    assert 'viewBox="0 0 192 144"' in svg
    assert "supplier,total" in svg
    assert "OpenAI,20.00" in svg


def test_thumbnail_batch_uses_text_renderer(tmp_path: Path) -> None:
    (tmp_path / "a.txt").write_text("first line\nsecond line\n", encoding="utf-8")
    result = previewer.preview_thumbnails(root=str(tmp_path), paths=["a.txt"])
    assert result["ok"] is True
    assert result["count"] == 1
    assert result["thumbnails"][0]["backend"] == "svg-text"
