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

namespace TeleWave.Application.Library.Genres.DeleteGenre;

public sealed class DeleteGenreCommandHandler(IAppDbContext dbContext)
    : ICommandHandler<DeleteGenreCommand, Result>
{
    public async Task<Result> Handle(
        DeleteGenreCommand command,
        CancellationToken cancellationToken
    )
    {
        var genre = await dbContext.Genres.FirstOrDefaultAsync(
            g => g.Id == command.GenreId,
            cancellationToken
        );
        if (genre is null)
            return Result.Failure(GenreErrors.NotFound);

        if (genre.IsSystem)
            return Result.Failure(GenreErrors.SystemCannotBeDeleted);

        // Связь ShowGenre→Genre настроена как Restrict: без этой проверки удаление упало бы
        // исключением БД вместо управляемой ошибки.
        if (await dbContext.ShowGenres.AnyAsync(sg => sg.GenreId == genre.Id, cancellationToken))
            return Result.Failure(GenreErrors.InUse);

        dbContext.Genres.Remove(genre);
        return Result.Success();
    }
}
