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

namespace TeleWave.Application.Images.DeleteImage;

public sealed class DeleteImageCommandHandler(IAppDbContext dbContext, IImageStore storage)
    : ICommandHandler<DeleteImageCommand, Result>
{
    public async Task<Result> Handle(
        DeleteImageCommand command,
        CancellationToken cancellationToken
    )
    {
        var image = await dbContext.Images.FirstOrDefaultAsync(
            i => i.Id == command.Id,
            cancellationToken
        );
        if (image is null)
            return Result.Failure(ImageErrors.NotFound);

        // Сначала коммитим удаление в БД, затем файл (best-effort): orphan-файл безопаснее строки БД,
        // ссылающейся на уже удалённую картинку.
        var imageId = image.Id;
        var extension = image.FileExtension;
        dbContext.Images.Remove(image);
        await dbContext.SaveChangesAsync(cancellationToken);
        await storage.DeleteAsync(imageId, extension, cancellationToken);
        return Result.Success();
    }
}
