using Kean.Domain.Message.Commands;
using Kean.Domain.Message.Repositories;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace Kean.Domain.Message.CommandHandlers
{
    /// <summary>
    /// 标记命令处理程序
    /// </summary>
    public sealed class MarkMessageCommandHandler : CommandHandler<MarkMessageCommand>
    {
        private readonly ICommandBus _commandBus; // 消息总线
        private readonly IMessageRepository _messageRepository; // 消息仓库

        /// <summary>
        /// 依赖注入
        /// </summary>
        public MarkMessageCommandHandler(
            ICommandBus commandBus,
            IMessageRepository messageRepository)
        {
            _commandBus = commandBus;
            _messageRepository = messageRepository;
        }

        /// <summary>
        /// 处理程序
        /// </summary>
        public override async Task Handle(MarkMessageCommand command, CancellationToken cancellationToken)
        {
            if (command.ValidationResult.IsValid)
            {
                List<int> result = new();
                foreach (var item in command.MessageId)
                {
                    await _messageRepository.MarkMessage(command.UserId, item, command.Flag);
                    result.Add(item);
                }
                command.MessageId = result;
            }
            else
            {
                await _commandBus.Notify(command.ValidationResult,
                    cancellationToken: cancellationToken);
            }
        }
    }
}