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

namespace TeleWave.Application.Library.SetShowGenres;

public sealed class SetShowGenresCommandHandler(IAppDbContext dbContext)
    : ICommandHandler<SetShowGenresCommand, Result>
{
    public async Task<Result> Handle(
        SetShowGenresCommand command,
        CancellationToken cancellationToken
    )
    {
        var show = await dbContext
            .Shows.Include(s => s.Genres)
            .FirstOrDefaultAsync(s => s.Id == command.ShowId, cancellationToken);
        if (show is null)
            return Result.Failure(ShowErrors.NotFound);

        var ids = command.GenreIds.Distinct().ToList();
        if (ids.Count > 0)
        {
            // Ссылка на несуществующий жанр упала бы нарушением внешнего ключа — проверяем заранее.
            var known = await dbContext
                .Genres.Where(g => ids.Contains(g.Id))
                .CountAsync(cancellationToken);
            if (known != ids.Count)
                return Result.Failure(GenreErrors.NotFound);
        }

        show.SetGenres(ids, command.PrimaryGenreId);
        return Result.Success();
    }
}
