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

namespace TeleWave.Application.Broadcast.GetChannel;

public sealed class GetChannelQueryHandler(IAppDbContext dbContext)
    : IQueryHandler<GetChannelQuery, Result<ChannelDto>>
{
    public async Task<Result<ChannelDto>> Handle(
        GetChannelQuery query,
        CancellationToken cancellationToken
    )
    {
        // Что и когда идёт в эфире, лежит в шаблоне сетки и запрашивается отдельно
        // (GetChannelTemplateQuery) — здесь только собственные свойства канала.
        var channel = await dbContext
            .Channels.AsNoTracking()
            .FirstOrDefaultAsync(c => c.Id == query.Id, cancellationToken);
        if (channel is null)
            return Result.Failure<ChannelDto>(ChannelErrors.NotFound);

        return Result.Success(
            new ChannelDto(
                channel.Id,
                channel.Name,
                channel.Slug,
                channel.IsEnabled,
                channel.Number,
                channel.UtcOffsetMinutes,
                channel.DayStartTime,
                channel.TemplateId,
                channel.FillerAssetId,
                new ViewerSettingsDto(
                    channel.LogoImageId,
                    channel.LogoCorner,
                    channel.LogoOpacity,
                    channel.ShowClock,
                    channel.AnalogFilterStrength
                )
            )
        );
    }
}
