using LiteCqrs;
using Microsoft.EntityFrameworkCore;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Common.Models;

namespace TeleWave.Application.Library.Collections.Suggest;

public sealed class AddSuggestedShowsCommandHandler(
    IAppDbContext dbContext,
    CollectionSuggestionBuilder builder,
    CollectionPosterPicker posters
) : ICommandHandler<AddSuggestedShowsCommand, Result<int>>
{
    public async Task<Result<int>> Handle(
        AddSuggestedShowsCommand command,
        CancellationToken cancellationToken
    )
    {
        var suggestions = await builder.BuildAsync(cancellationToken);
        var suggestion = suggestions.FirstOrDefault(s => s.Key == command.Key);

        // Ключ создания сюда приходить не должен: у такого предложения нет коллекции, которую
        // дополнять. Для админа это одно и то же — список предложений устарел.
        if (suggestion?.CollectionId is not { } collectionId)
            return Result.Failure<int>(CollectionErrors.SuggestionNotFound);

        var collection = await dbContext
            .Collections.Include(c => c.Items)
            .FirstOrDefaultAsync(c => c.Id == collectionId, cancellationToken);
        if (collection is null)
            return Result.Failure<int>(CollectionErrors.NotFound);

        // Части предложения уже упорядочены по году, а AddShow ставит в конец: франшиза пополняется
        // в хронологии, и переставлять руками обычно не приходится.
        var added = suggestion.Parts.Count(part => collection.AddShow(part.ShowId) is not null);

        // Коллекция без постера могла остаться такой именно потому, что первой части не хватало.
        // Уже выбранный постер подборщик не трогает — проверять это здесь незачем.
        await posters.FillAsync([collection], cancellationToken);

        return Result.Success(added);
    }
}
