using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Text;

namespace Edu.Common.Message
{

    /// <summary>
    /// 消息队列帮助类
    /// </summary>
    public class MessageHelper : IDisposable
    {
        private readonly ConnectionFactory _factory;
        private IConnection _connection;
        private IModel _channel;

        /// <summary>
        /// 构造函数
        /// </summary>
        public MessageHelper()
        {
            Int32.TryParse(Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "Port"), out int Port);
            RabbitConfig rabbitConfig = new RabbitConfig()
            {
                HostName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "HostName"),
                Password = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "Password"),
                Port = Port,
                UserName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "UserName"),
                QueenName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "QueenName"),
            };
            // 设置连接参数
            _factory = new ConnectionFactory()
            {
                HostName = rabbitConfig.HostName,
                //默认端口
                Port = Port,
                UserName = rabbitConfig.UserName,
                Password = rabbitConfig.Password,
            };
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="message"></param>
        /// <param name="PushAppId"></param>
        private void SendMessage(PushMessageModel message)
        {
            try
            {
                InitConnection();
                Int32.TryParse(Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "Port"), out int Port);
                RabbitConfig rabbitConfig = new RabbitConfig()
                {
                    HostName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "HostName"),
                    Password = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "Password"),
                    Port = Port,
                    UserName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "UserName"),
                    QueenName = Common.Config.ReadConfigKey("RabbitMqConfig", subKey: "QueenName"),
                };
                string queenName = rabbitConfig.QueenName;
                var obj = new
                {
                    Id = 0,// 主键
                    message.Title,
                    message.Content,
                    message.CoverImg,
                    message.CategoryId,
                    message.Platform,
                    message.SendType,
                    message.SendTime,
                    message.ReceiveId,
                    message.JumpUrl,
                    message.CreateByName,
                    message.MsgSign,
                    message.MsgTemplateCode,
                    message.WorkMsgType,
                    Status = 0,
                    CreateTime = DateTime.Now,
                    AppId = Common.Config.PushAppId,
                    IsRead = 0,
                };
                var body = Encoding.UTF8.GetBytes(Common.Plugin.JsonHelper.Serialize(obj));
                // 声明队列
                _channel.QueueDeclare(queue: queenName,
                    durable: true,// 设置为true表示队列是持久化的
                    exclusive: false,
                    autoDelete: false,
                    arguments: null);
                IBasicProperties properties = _channel.CreateBasicProperties();
                properties.DeliveryMode = 2;
                _channel.BasicPublish(exchange: "", routingKey: queenName, basicProperties: properties, body: body);
                Common.Plugin.LogHelper.WriteInfo("发送企微消息:" + Common.Plugin.JsonHelper.Serialize(obj));
            }
            catch (Exception ex)
            {
                Common.Plugin.LogHelper.Write(ex, "SendMessage");
            }
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="list"></param>
        /// <param name="PushAppId"></param>
        public void SendMessage(List<PushMessageModel> list)
        {
            foreach (var item in list)
            {
                SendMessage(item);
            }
        }

        /// <summary>
        /// 初始化链接
        /// </summary>
        private void InitConnection()
        {
            try
            {
                if (_connection == null || !_connection.IsOpen)
                {
                    _connection = _factory.CreateConnection();
                    _channel = _connection.CreateModel();
                }
            }
            catch (Exception ex)
            {
                Common.Plugin.LogHelper.Write(ex, "InitConnection");
            }
        }

        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            _channel?.Close();
            _channel?.Dispose();
            _connection?.Close();
            _connection?.Dispose();
        }
    }
}