package com.tandbergtv.watchpoint.pmm.util;

import java.util.ArrayList;
import java.util.List;

import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.log4j.Logger;

import com.tandbergtv.cms.rules.service.category.IRuleExecutionHandler;
import com.tandbergtv.marvin.udt.ActionMessage;
import com.tandbergtv.marvin.udt.RuleResults;
import com.tandbergtv.watchpoint.pmm.entities.Title;

public class RulesEngineFacade {
	private static final Logger logger = Logger.getLogger(RulesEngineFacade.class);
	
	public static Title nationalize(Title title) {
		IRuleExecutionHandler reh = getRuleExecutionHandler();
		List<Title> titles = new ArrayList<Title>();
		titles.add(title);
		List<RuleResults> ruleResultsList = reh.takeMeToYourNationalizeRuler(titles);
		//get asset from first RuleResults object
		if(ruleResultsList != null && !ruleResultsList.isEmpty()) {
			RuleResults ruleResults = ruleResultsList.get(0);
			if(ruleResults != null)
				return ruleResults.getAsset();
		}
		return null;
	}
	
	public static List<ActionMessage> validate(Title title) {
		IRuleExecutionHandler reh = getRuleExecutionHandler();
		List<Title> titles = new ArrayList<Title>();
		titles.add(title);
		List<RuleResults> ruleResultsList = reh.takeMeToYourValidateRuler(titles);
		//get action messages from first RuleResults object
		if(ruleResultsList != null && !ruleResultsList.isEmpty()) {
			RuleResults ruleResults = ruleResultsList.get(0);
			if(ruleResults != null)
				return ruleResults.getMessages();
		}
		return new ArrayList<ActionMessage>(0);
	}
	
	public static void sendNationalizedEvent(Long titleId) {
		sendEvent("TitleNationalized", titleId);
	}

	public static void sendIngestedCreatedEvent(Long titleId) {
		sendEvent("TitleIngestCreated", titleId);
	}

	public static void sendIngestedUpdatedEvent(Long titleId) {
		sendEvent("TitleIngestUpdated", titleId);
	}

	private static IRuleExecutionHandler getRuleExecutionHandler() {
		IRuleExecutionHandler reh = null;
		try {
			reh = (IRuleExecutionHandler) new InitialContext().lookup("cms/EventHandler/local");
		} catch (NamingException e) {
			logger.error("Unable to obtain IRuleExecutionHandler implementation from context", e);
		}
		return reh;
	}
	
	private static void sendEvent(String eventType, Long titleId) {
		Context context = null;
		QueueConnection queueConnection = null;
		QueueSession queueSession = null;
		Queue queue = null;
		QueueSender queueSender = null;
		
		try {
			context = new InitialContext();
			QueueConnectionFactory queueFactory = (QueueConnectionFactory) context.lookup("java:/JmsXA");
			queueConnection = queueFactory.createQueueConnection();
			queueSession = queueConnection.createQueueSession(true, 0);
			queue = (Queue) context.lookup("queue/EventQueue");
			queueSender = queueSession.createSender(queue);

			ObjectMessage message = queueSession.createObjectMessage();
			message.setStringProperty("eventType", eventType);
			message.setLongProperty("titleId", titleId);
			
			queueSender.send(queue, message);
		} catch (Exception e) {
			logger.error("Exception while sending the event", e);
		} finally {
				try {
					if(queueSession != null)
						queueSession.close();
					if(context != null)
						context.close();
				} catch (Exception e) {
					logger.error("Failed to close the JMS session and context", e);
				}
		}
	}
}
