using LiteCqrs;
using Microsoft.EntityFrameworkCore;
using TeleWave.Application.Broadcast;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Common.Models;
using TeleWave.Domain.Programming;

namespace TeleWave.Application.Programming.Templates.CreateTemplate;

public sealed class CreateChannelTemplateCommandHandler(IAppDbContext dbContext)
    : ICommandHandler<CreateChannelTemplateCommand, Result<Guid>>
{
    public async Task<Result<Guid>> Handle(
        CreateChannelTemplateCommand command,
        CancellationToken cancellationToken
    )
    {
        var channel = await dbContext.Channels.FirstOrDefaultAsync(
            c => c.Id == command.ChannelId,
            cancellationToken
        );
        if (channel is null)
            return Result.Failure<Guid>(ChannelErrors.NotFound);

        // Шаблон мог остаться от прошлой жизни канала, потеряв ссылку на себя, — тогда просто
        // возвращаем его, а не заводим второй: одна сетка на канал.
        var existing = await dbContext.ScheduleTemplates.FirstOrDefaultAsync(
            t => t.ChannelId == channel.Id,
            cancellationToken
        );
        if (existing is not null)
        {
            channel.SetTemplate(existing.Id);
            return Result.Success(existing.Id);
        }

        var template = ScheduleTemplate.Create(channel.Id, channel.Name);
        dbContext.ScheduleTemplates.Add(template);
        channel.SetTemplate(template.Id);
        return Result.Success(template.Id);
    }
}
