using TeleWave.Application.Library;
using TeleWave.Domain.Library;

namespace TeleWave.Application.Metadata;

/// <summary>
/// Что из сезонов/серий шоу реально загружено — общая основа отчётов об отсутствующем. Номера
/// берутся проставленные, а при их отсутствии распознаются из имени файла (в отличие от обновления
/// метаданных, распознанное не сохраняется: отчёты ничего не меняют).
/// </summary>
internal static class LoadedEpisodeNumbers
{
    /// <summary>Загруженные номера серий по сезонам — только сезоны, где есть хотя бы одна серия.</summary>
    public static Dictionary<int, HashSet<int>> GroupBySeason(
        Show show,
        IReadOnlyDictionary<Guid, string> assetNames
    )
    {
        var loadedBySeason = new Dictionary<int, HashSet<int>>();
        foreach (var episode in show.Episodes)
        {
            if (Resolve(episode, assetNames) is not { } numbers)
                continue;

            if (!loadedBySeason.TryGetValue(numbers.Season, out var set))
                loadedBySeason[numbers.Season] = set = [];
            set.Add(numbers.Episode);
        }
        return loadedBySeason;
    }

    /// <summary>Сезон и номер серии: проставленные либо распознанные из имени файла; null — не вышло.</summary>
    private static (int Season, int Episode)? Resolve(
        ShowEpisode episode,
        IReadOnlyDictionary<Guid, string> assetNames
    )
    {
        if (episode.Season is { } season && episode.Episode is { } number)
            return (season, number);

        return assetNames.TryGetValue(episode.MediaAssetId, out var name)
            ? EpisodeName.Parse(name)
            : null;
    }
}
