"""Statistiques liées aux minifigs pour les sets filtrés."""

from pathlib import Path
from typing import Dict, Iterable, List, Sequence, Tuple

from lib.rebrickable.parts_inventory import index_inventory_minifigs_by_inventory, select_latest_inventories
from lib.rebrickable.stats import read_rows


MINIFIG_TOTAL_LABEL = "Nombre total de minifigs (thèmes filtrés)"
TOTAL_PARTS_LABEL = "Total de pièces pour les thèmes filtrés"


def load_filtered_sets(path: Path) -> List[dict]:
    """Charge les sets filtrés depuis un CSV."""
    return read_rows(path)


def compute_total_minifigs(
    filtered_sets: Iterable[dict],
    inventories: Dict[str, dict],
    minifigs_by_inventory: Dict[str, List[dict]],
) -> int:
    """Additionne les minifigs présentes dans les inventaires des sets filtrés."""
    total = 0
    for set_row in filtered_sets:
        inventory = inventories[set_row["set_num"]]
        for minifig_row in minifigs_by_inventory.get(inventory["id"], []):
            total += int(minifig_row["quantity"])
    return total


def compute_filtered_minifig_total(
    filtered_sets: Iterable[dict],
    inventories_path: Path,
    inventory_minifigs_path: Path,
) -> int:
    """Calcule le total de minifigs pour les sets filtrés à partir des CSV bruts."""
    inventories = select_latest_inventories(inventories_path)
    minifigs_by_inventory = index_inventory_minifigs_by_inventory(inventory_minifigs_path)
    return compute_total_minifigs(filtered_sets, inventories, minifigs_by_inventory)


def merge_minifig_stat(stats: Sequence[Tuple[str, str]], total_minifigs: int) -> List[Tuple[str, str]]:
    """Insère le total de minifigs en évitant les doublons et en préservant l'ordre."""
    filtered_stats = [(label, value) for label, value in stats if label != MINIFIG_TOTAL_LABEL]
    insertion_index = next(
        (index for index, (label, _) in enumerate(filtered_stats) if label == TOTAL_PARTS_LABEL),
        len(filtered_stats),
    )
    return (
        filtered_stats[: insertion_index + 1]
        + [(MINIFIG_TOTAL_LABEL, str(total_minifigs))]
        + filtered_stats[insertion_index + 1 :]
    )
