namespace MaBibli.Shared.Dtos;

/// <summary>Calcul des compteurs récursifs de l'arbre des séries.</summary>
public static class TotauxSeries
{
    public static IReadOnlyDictionary<int, (int Possedes, int Total)> Calculer(
        IReadOnlyList<SerieDto> series)
    {
        var parentees = series
            .Where(s => s.SerieParenteId is not null)
            .GroupBy(s => s.SerieParenteId!.Value)
            .ToDictionary(g => g.Key, g => g.ToList());
        var resultat = new Dictionary<int, (int Possedes, int Total)>();
        var enCours = new HashSet<int>();

        (int Possedes, int Total) CalculerUne(SerieDto serie)
        {
            if (resultat.TryGetValue(serie.Id, out var connu))
            {
                return connu;
            }

            if (!enCours.Add(serie.Id))
            {
                return (0, 0);
            }

            var total = (serie.NombrePossedes, serie.Elements.Count);
            if (parentees.TryGetValue(serie.Id, out var filles))
            {
                foreach (var fille in filles)
                {
                    var sousTotal = CalculerUne(fille);
                    total = (total.Item1 + sousTotal.Possedes, total.Item2 + sousTotal.Total);
                }
            }

            enCours.Remove(serie.Id);
            resultat[serie.Id] = total;
            return total;
        }

        foreach (var serie in series)
        {
            CalculerUne(serie);
        }

        return resultat;
    }
}
