"""Fixtures partagées.

Le corpus de `data/input/` est lu tel quel : c'est la seule façon de garantir
que les parseurs suivent le format réel, et non une idée qu'on s'en fait. Les
tests ne l'écrivent jamais.
"""

from __future__ import annotations

import sqlite3
from collections.abc import Iterator

import pytest

from pipeline import chemins, db


@pytest.fixture(scope="session")
def annexe() -> str:
    """Contenu de `sec10.md`, l'annexe récapitulative."""
    return chemins.chapitre(10).read_text(encoding="utf-8")


@pytest.fixture(scope="session")
def textes_annexe():
    """Textes extraits de l'annexe, analysés une seule fois pour la session."""
    from pipeline.parseurs.tableaux_sec10 import parser

    return parser(chemins.chapitre(10).read_text(encoding="utf-8"))


@pytest.fixture(scope="session")
def par_identifiant(textes_annexe) -> dict:
    return {texte.id: texte for texte in textes_annexe.textes}


@pytest.fixture
def base(tmp_path) -> Iterator[sqlite3.Connection]:
    """Base SQLite éphémère, migrée, propre à chaque test."""
    cx = db.initialiser(tmp_path / "test.db")
    try:
        yield cx
    finally:
        cx.close()


@pytest.fixture
def base_ensemencee(base, textes_annexe) -> sqlite3.Connection:
    """Base contenant les textes de l'annexe."""
    db.enregistrer_textes(base, textes_annexe.textes)
    return base
