package RabbitMQ

import "github.com/streadway/amqp"

// rabbitMQ结构体
type RabbitMQ struct {
	Conn             *amqp.Connection
	ConsumerChannel  *amqp.Channel
	PublisherChannel *amqp.Channel
	QueueConfig      QueueConfig
	ExchangeConfig   ExchangeConfig
	Consumer
	Publisher
}

type Opt func()

type Consumer struct {
	autoAck   bool       //是否自动应答
	exclusive bool       //是否独有
	noLocal   bool       // //设置为true，表示 不能将同一个Conenction中生产者发送的消息传递给这个Connection中 的消费者
	noWait    bool       //列是否阻塞
	args      amqp.Table // 额外的属性
}

// AutoAck 自动应答
func (c *Consumer) AutoAck() Opt {
	return func() {
		c.autoAck = true
	}
}

// Exclusive 独有
func (c *Consumer) Exclusive() Opt {
	return func() {
		c.exclusive = true
	}
}

// NoLocal 设置为true，表示不能将同一个Conenction中生产者发送的消息传递给这个Connection中的消费者
func (c *Consumer) NoLocal() Opt {
	return func() {
		c.noLocal = true
	}
}

// NoWait 是否阻塞
func (c *Consumer) NoWait() Opt {
	return func() {
		c.noWait = true
	}
}

type Publisher struct {
	mandatory bool //
	immediate bool //
}

// Mandatory  是否将无法路由到任何队列的消息返回
func (p *Publisher) Mandatory() Opt {
	return func() {
		p.mandatory = true
	}
}

// Immediate 当exchange发送消息到队列后发现队列上没有消费者，则会把消息返还给发送者
func (p *Publisher) Immediate() Opt {
	return func() {
		p.immediate = true
	}
}

// 配置
type QueueConfig struct {
	durable    bool       // 是否持久化
	autoDelete bool       // 是否自动删除
	exclusive  bool       // 是否独占连接
	noWait     bool       // 是否阻塞处理
	args       amqp.Table // 额外的属性
}

// Durable 队列持久化
func (c *QueueConfig) Durable() Opt {
	return func() {
		c.durable = true
	}
}

// AutoDelete 队列自动删除
func (c *QueueConfig) AutoDelete() Opt {
	return func() {
		c.autoDelete = true
	}
}

// Exclusive 队列独占连接
func (c *QueueConfig) Exclusive() Opt {
	return func() {
		c.exclusive = true
	}
}

// NoWait 是否阻塞
func (c *QueueConfig) NoWait() Opt {
	return func() {
		c.noWait = true
	}
}

// Args 额外的属性
func (c *QueueConfig) Args(args amqp.Table) Opt {
	return func() {
		c.args = args
	}
}

type ExchangeConfig struct {
	durable    bool       //是否持久化
	autoDelete bool       //是否自动删除
	internal   bool       // 是否内部处理
	noWait     bool       //是否阻塞处理
	args       amqp.Table //额外的属性
}

// Durable 交换机持久化
func (c ExchangeConfig) Durable() Opt {
	return func() {
		c.durable = true
	}
}

// AutoDelete 交换机自动删除
func (c *ExchangeConfig) AutoDelete() Opt {
	return func() {
		c.autoDelete = true
	}
}

// Internal 是否内部处理
func (c *ExchangeConfig) Internal() Opt {
	return func() {
		c.internal = true
	}
}

// NoWait 是否阻塞
func (c *ExchangeConfig) NoWait() Opt {
	return func() {
		c.noWait = true
	}
}

// Args 额外的属性
func (c *ExchangeConfig) Args(args amqp.Table) Opt {
	return func() {
		c.args = args
	}
}
