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

namespace TeleWave.Application.Broadcast.Bumpers;

public sealed class DeleteBumperTemplateCommandHandler(
    IAppDbContext dbContext,
    IBumperTemplateStorage storage
) : ICommandHandler<DeleteBumperTemplateCommand, Result>
{
    public async Task<Result> Handle(
        DeleteBumperTemplateCommand command,
        CancellationToken cancellationToken
    )
    {
        var template = await BumperTemplateLoader.LoadAsync(
            dbContext,
            command.TemplateId,
            cancellationToken
        );
        if (template is null)
            return Result.Failure(BumperErrors.TemplateNotFound);

        // Блок общий: удалив используемый, мы бы молча выключили заставки в чужих каналах.
        var used = await dbContext.JunctionElements.AnyAsync(
            e => e.BumperTemplateId == template.Id,
            cancellationToken
        );
        if (used)
        {
            // Имя стыка — по связи врезки с ним; факт использования проверен отдельно и раньше.
            var junctions = await (
                from element in dbContext.JunctionElements
                join junction in dbContext.JunctionTemplates
                    on element.JunctionTemplateId equals junction.Id
                where element.BumperTemplateId == template.Id
                select junction.Name
            )
                .Distinct()
                .ToListAsync(cancellationToken);

            return Result.Failure(
                BumperErrors.TemplateInUse(UsageText.Part("стыки", junctions) ?? string.Empty)
            );
        }

        dbContext.BumperTemplates.Remove(template);
        await storage.DeleteAudioAsync(template.Id, cancellationToken);
        return Result.Success();
    }
}
