"""Tests des statistiques calculées sur les sets LEGO filtrés."""

from lib.rebrickable.stats import compute_basic_stats, write_stats_csv


def test_compute_basic_stats_returns_expected_values(tmp_path) -> None:
    """Calcule les statistiques principales sur un échantillon maîtrisé."""
    themes = [
        {"id": "602", "name": "Jurassic World", "parent_id": ""},
        {"id": "274", "name": "Jurassic Park III", "parent_id": "273"},
    ]
    all_sets = [
        {"set_num": "123-1", "name": "A", "year": "2020", "theme_id": "602", "num_parts": "100", "img_url": ""},
        {"set_num": "124-1", "name": "B", "year": "2021", "theme_id": "602", "num_parts": "200", "img_url": ""},
        {"set_num": "125-1", "name": "C", "year": "2021", "theme_id": "274", "num_parts": "300", "img_url": ""},
    ]
    filtered_sets = [
        {"set_num": "123-1", "name": "A", "year": "2020", "theme_id": "602", "num_parts": "100", "img_url": ""},
        {"set_num": "124-1", "name": "B", "year": "2021", "theme_id": "602", "num_parts": "200", "img_url": ""},
    ]
    enriched_sets = [
        {
            "set_num": "123-1",
            "name": "A",
            "year": "2020",
            "theme_id": "602",
            "num_parts": "100",
            "img_url": "",
            "set_id": "123",
            "rebrickable_url": "",
            "in_collection": "true",
        },
        {
            "set_num": "124-1",
            "name": "B",
            "year": "2021",
            "theme_id": "602",
            "num_parts": "200",
            "img_url": "",
            "set_id": "124",
            "rebrickable_url": "",
            "in_collection": "false",
        },
    ]

    stats = compute_basic_stats(themes, all_sets, filtered_sets, enriched_sets)

    assert stats == [
        ("Nombre total de sets (catalogue complet)", "3"),
        ("Nombre total de thèmes (catalogue complet)", "2"),
        ("Nombre de sets après filtrage (thèmes ciblés)", "2"),
        ("Nombre moyen de sets par thème (catalogue complet)", "1.50"),
        ("Pourcentage des sets filtrés vs total", "66.67%"),
        ("Taux de possession (thèmes filtrés)", "50.00%"),
        ("Sets dans la collection", "1"),
        ("Sets manquants pour la collection", "1"),
        ("Nombre moyen de pièces par set (thèmes filtrés)", "150.00"),
        ("Médiane de pièces par set (thèmes filtrés)", "150.00"),
        ("Nombre moyen de sets commercialisés par an (thèmes filtrés)", "1.00"),
        ("Total de pièces pour les thèmes filtrés", "300"),
        ("Total de pièces des sets possédés", "100"),
        ("Pourcentage de pièces possédées (thèmes filtrés)", "33.33%"),
        ("Nombre de thèmes filtrés", "1"),
        ("Première année de sortie (thèmes filtrés)", "2020"),
        ("Dernière année de sortie (thèmes filtrés)", "2021"),
        ("Année la plus prolifique (thèmes filtrés)", "2020 (1 sets)"),
        ("Set avec le plus de pièces (thèmes filtrés)", "124-1 - B (200 pièces)"),
        ("Set avec le moins de pièces (thèmes filtrés)", "123-1 - A (100 pièces)"),
        ("Set le plus ancien (thèmes filtrés)", "123-1 - A (2020)"),
        ("Set le plus récent (thèmes filtrés)", "124-1 - B (2021)"),
        ("Nombre moyen de pièces des sets possédés", "100.00"),
        ("Nombre moyen de pièces des sets manquants", "200.00"),
    ]


def test_write_stats_csv_outputs_two_columns(tmp_path) -> None:
    """Écrit un CSV simple avec libellé et valeur."""
    destination = tmp_path / "stats.csv"
    stats = [("A", "1"), ("B", "2")]

    write_stats_csv(destination, stats)

    assert destination.read_text() == "libelle,valeur\nA,1\nB,2\n"
