"""Tests para render_paper_pdf — DoD: golden + edges + error path.

Autocontenido y sin red: escribe papers Markdown sintéticos en directorios
temporales y verifica que el PDF se genera (estado, nº de páginas, archivo
no vacío) reutilizando el motor de paginación de ``automatic_eda``.
"""

import os
import tempfile

from datascience.render_paper_pdf import render_paper_pdf


_GOLDEN_PAPER = """---
title: A Minimal IMRaD Paper
authors:
  - Ada Lovelace
  - Alan Turing
date: 2026-06-30
abstract: >
  Demostramos que el motor de paginación rinde un paper IMRaD completo en PDF
  móvil sin cortar texto ni tablas.
---

# Introduction

Este es el cuerpo de la introducción con **texto en negrita** y una lista:

- Primer punto.
- Segundo punto.

# Methods

Resultados resumidos en una tabla pipe:

| Métrica | Valor |
| --- | --- |
| Precisión | 0.91 |
| Recall | 0.88 |

Texto final de la sección de métodos.
"""


def test_golden_genera_pdf_con_portada_y_secciones(tmp_path):
    """Golden: paper IMRaD con frontmatter + 2 secciones + tabla → PDF válido."""
    paper_dir = tmp_path / "zz-demo"
    paper_dir.mkdir()
    (paper_dir / "paper.md").write_text(_GOLDEN_PAPER, encoding="utf-8")

    res = render_paper_pdf(str(paper_dir))

    assert res["status"] == "ok", res
    assert res["n_pages"] >= 1
    pdf_path = res["pdf_path"]
    assert pdf_path is not None
    assert os.path.exists(pdf_path)
    assert os.path.getsize(pdf_path) > 0


def test_edge_sin_frontmatter_ni_figuras(tmp_path):
    """Edge 1: cuerpo plano sin frontmatter ni figuras → genera PDF igual."""
    paper_dir = tmp_path / "plano"
    paper_dir.mkdir()
    (paper_dir / "paper.md").write_text(
        "Solo un cuerpo plano, sin frontmatter ni encabezados de nivel 1.\n"
        "Un par de líneas de texto corrido para que el motor lo pagine.\n",
        encoding="utf-8",
    )

    res = render_paper_pdf(str(paper_dir))

    assert res["status"] == "ok", res
    assert res["n_pages"] >= 1
    assert os.path.exists(res["pdf_path"])


def test_edge_path_inexistente_no_revienta():
    """Edge 2: directorio inexistente → status error, sin crash, pdf_path None."""
    res = render_paper_pdf("/tmp/no_existe_xyz_123")

    assert res["status"] == "error"
    assert res["pdf_path"] is None
    assert res["n_pages"] == 0
    assert "no encontrado" in (res["note"] or "")


def test_edge_figura_inexistente_degrada(tmp_path):
    """Edge 3: referencia a figura inexistente → el PDF se genera igual."""
    paper_dir = tmp_path / "con-figura"
    paper_dir.mkdir()
    (paper_dir / "paper.md").write_text(
        "---\n"
        "title: Paper Con Figura Rota\n"
        "---\n\n"
        "# Results\n\n"
        "Texto antes de la figura.\n\n"
        "![Una figura que no existe](figures/no.png)\n\n"
        "Texto después de la figura.\n",
        encoding="utf-8",
    )

    res = render_paper_pdf(str(paper_dir))

    assert res["status"] == "ok", res
    assert res["n_pages"] >= 1
    assert os.path.exists(res["pdf_path"])


def test_acepta_ruta_directa_al_md(tmp_path):
    """Acepta también la ruta directa a un paper.md (no solo el directorio)."""
    md = tmp_path / "paper.md"
    md.write_text("# Discussion\n\nCuerpo de la discusión.\n", encoding="utf-8")

    res = render_paper_pdf(str(md))

    assert res["status"] == "ok", res
    assert os.path.exists(res["pdf_path"])
