using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.Core.Common.Interfaces.RabbitServices;
using PARR.Core.Repositories.Interfaces;
using PARR.Domain.Common.Rabbit.Messages;
using PARR.TemplateMatcher.Services.Interfaces;
using PARR.TemplateMatcher.Settings;

namespace PARR.TemplateMatcher.Services.Implementations;

internal class TemplateUpdaterMqSender : ITemplateUpdaterMqSender
{
    private readonly ILogger<TemplateUpdaterMqSender> logger;
    private readonly IRabbitService mqService;
    private readonly MqSettings mqSettings;
    private readonly ITemplateRepository templateService;

    public TemplateUpdaterMqSender(
        ILogger<TemplateUpdaterMqSender> logger,
        IRabbitService mqService,
        MqSettings mqSettings,
        ITemplateRepository templateService
        )
    {
        this.logger = logger;
        this.mqService = mqService;
        this.mqSettings = mqSettings;
        this.templateService = templateService;
    }

    public async Task SendTemplateUpdateMessageAsync(TemplateUpdaterMq updateRequest)
    {
        logger.LogDebug("Отправка сообщения в очередь '{Queue}' для шаблона {TemplateId}",
            mqSettings.TemplateUpdater.QueueName, updateRequest.TemplateId);


        //var existingTemplateByName = await templateService.Get().AsNoTracking()
        //                                .FirstOrDefaultAsync(t => EF.Functions.ILike(t.Name, updateRequest.Name) && updateRequest.TemplateId != t.Id);
        //if (existingTemplateByName != null)
        //{
        //    logger.LogError("Шаблон с именем {TemplateName} уже существует в базе данных. Текущий Id:{TemplateId}", existingTemplateByName.Name, existingTemplateByName.Id);
        //    return;
        //}

        var result = await mqService.SendAsync(mqSettings.TemplateUpdater, new List<object> { updateRequest });

        if (result.IsSuccess)
        {
            logger.LogInformation("Отправлен запрос на обновление шаблона {TemplateId}", updateRequest.TemplateId);
        }
        else
        {
            logger.LogError("Ошибка при отправке запроса на обновление шаблона {TemplateId} в очередь '{Queue}'.",
                updateRequest.TemplateId, mqSettings.TemplateUpdater.QueueName);
        }
    }
}