package com.currencyboot.web;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.currencyboot.domain.mq.AttributeNames;
import com.currencyboot.service.rocketmq.MqConsumer;
import com.currencyboot.service.rocketmq.spring.SpringContextUtils;

/**
* <p>Title: MqConsumerController </p>
* <p>@Description:  MqConsumer 消费端 控制类  </p>
* <p>Company:  </p>
* @author 李文
* @date   2016年5月20日 下午7:21:12 
*/
@RequestMapping("rest/MqConsumer")
@RestController
@CrossOrigin
public class MqConsumerController
{

	private static final Logger LOGGER = LoggerFactory.getLogger(MqConsumerController.class);

	@Autowired
	private HttpServletRequest request;

	/**
	 *   
	 *   开启一个 消费端     
	 *      该方法会创建一个 消费端类 ,该类 将添加到servletContext 进行管理    
	 *   重要提示 每次调用改方法都会 开启一个新的消费端   
	 *   
	 * @param Topic   Topic
	 * @param Tags	Tag     标签可以 定 未获取多个    具体请看MQ 文档
	 * @return  是否成功开启
	 */
	@RequestMapping(method = RequestMethod.POST)
	public ResponseEntity<Void> startMqConsumerTag(@RequestParam("Topic") String Topic,
			@RequestParam("Tags") String Tags)
	{
		MqConsumer consumer;
		String clientID;
		try
		{
			consumer = (MqConsumer) SpringContextUtils.getBeanByClass(MqConsumer.class);
			if (Tags == null || "".equals(Tags)) Tags = "*";
			clientID = consumer.init(Topic, Tags);
		}
		catch (Exception e)
		{
			LOGGER.error("MqConsumerController 启动消费端异常  ", e);
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
		}

		ServletContext servletContext = request.getServletContext();

		if (servletContext.getAttribute(clientID) == null)
		{
			servletContext.setAttribute(clientID, consumer);
		}
		return ResponseEntity.status(HttpStatus.OK).build();
	}

	/**
	 *  销毁一个消费端 
	 *  
	 *     该方法  会通过传递的   ConsumerID 从 servletContext 查询 是否有 该对象 
	 *     然后调用 其销毁方法 
	 * 
	 * @param ConsumerID    消费者唯一标识   
	 * @return   
	 */
	@RequestMapping(method = RequestMethod.DELETE)
	public ResponseEntity<String> destroyMqConsumer(@RequestParam("Consumer") String Consumer)
	{

		ServletContext servletContext = request.getServletContext();

		Enumeration<String> attributeNames = servletContext.getAttributeNames();

		List<String> outList = new ArrayList<String>();

		Object AttributeConsumer = servletContext.getAttribute(Consumer);
		if (AttributeConsumer != null)
		{
			MqConsumer mqConsumer = (MqConsumer) AttributeConsumer;
			mqConsumer.destroy();
			servletContext.setAttribute(Consumer, null);

			return ResponseEntity.status(HttpStatus.OK).body(Consumer + " 消费者销毁成功");
		}

		return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Consumer + " 未找到   该消费者 ");
	}

	/**
	 * 获取servletContext 中存放的 所有  消费者对象 唯一标识 
	 * 
	 * @return  返回  说有消费者唯一标识  
	 * 
	 */
	@RequestMapping(method = RequestMethod.GET)
	public List<AttributeNames> queryMqConsumerList()
	{
		ServletContext servletContext = request.getServletContext();
		List<AttributeNames> list = new ArrayList<AttributeNames>();
		Enumeration<String> attributeNames = servletContext.getAttributeNames();
		while (attributeNames.hasMoreElements())
		{
			String nameString = (String) attributeNames.nextElement();
			if (nameString.contains("@"))
			{
				AttributeNames attri = new AttributeNames();
				attri.setKid(nameString);
				list.add(attri);
			}
		}
		return list;
	}

}