/**
 * JobTest.java
 * Created on May 13, 2008
 * (C) Copyright TANDBERG Television Ltd.
 */
package com.tandbergtv.watchpoint.pmm.job.unitTests;

import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;

import com.tandbergtv.watchpoint.pmm.entities.Context;
import com.tandbergtv.watchpoint.pmm.entities.Job;
import com.tandbergtv.watchpoint.pmm.entities.JobParameter;
import com.tandbergtv.watchpoint.pmm.entities.Rule;
import com.tandbergtv.watchpoint.pmm.entities.RuleParameter;
import com.tandbergtv.watchpoint.pmm.entities.RuleType;
import com.tandbergtv.workflow.core.ProcessPriority;

import junit.framework.TestCase;

/**
 * @author spuranik
 * 
 */
public class JobTest extends TestCase {

	private Logger logger;

	protected void setUp() {
		logger = Logger.getLogger(JobTest.class);
	}

	public void _testJobCreate() {
		try {
			// create a job object
			Job j = new Job();
			j.setName("Job1");
			j.setPriority(ProcessPriority.NORMAL);
			j.setTemplateName("020101");

			// assign this job a parameter
			JobParameter jp = new JobParameter();
			jp.setName("filepath");
			jp.setValue("c:\\");
			jp.setJob(j);
			List<JobParameter> jobParams = new ArrayList<JobParameter>();
			jobParams.add(jp);
			j.setJobParams(jobParams);

			// assign it a rule which has 1 param
			Rule r = new Rule();
			List<RuleParameter> params = new ArrayList<RuleParameter>();
			RuleParameter rp = new RuleParameter();
			rp.setValue("5");
			rp.setOrder(1);
			rp.setRule(r);
			params.add(rp);
			r.setParams(params);
			j.setRule(r);

			Session session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();

			// set the rule type from an existing one
			RuleType rt = new RuleType();
			long rtId = 1;
			session.load(rt, rtId);
			j.getRule().setType(rt);

			long contextId = 1;
			Context c = (Context) session.get(Context.class, contextId);
			j.setContext(c);

			// save the job along with its parameters
			session.save(j);
			session.getTransaction().commit();

			HibernateUtil.getSessionFactory().close();
			System.out.println("Done creating job");
		} catch (Exception e) {
			logger.error(e.getMessage());
			System.out.println(e.getMessage());
		}
	}

	public void _testJobRead() {
		try {
			Job j = new Job();
			long jobId = 10;
			Session session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			session.load(j, jobId);
			session.getTransaction().commit();
			HibernateUtil.getSessionFactory().close();

			System.out.println("Job Id: " + j.getId());
			System.out.println("Job Name: " + j.getName());
			System.out.println("Job Priority: " + j.getPriority());
			System.out.println("Job Context Id: " + j.getContext().getId());
			System.out.println("Job Rule Id: " + j.getRule().getId());
			System.out.println("Job Rule RuleType Name: " + j.getRule().getType().getName());
			List<RuleParameter> ruleParams = j.getRule().getParams();
			int i = 0;
			for (RuleParameter p : ruleParams) {
				System.out.println("Params[" + i + "] Id = " + p.getId());
				System.out.println("Params[" + i + "] Order = " + p.getOrder());
				System.out.println("Params[" + i + "] Value = " + p.getValue());
				System.out.println("Params[" + i + "] Parent Id = " + p.getRule().getId());
				i++;
			}

			List<JobParameter> params = j.getJobParams();
			i = 0;
			for (JobParameter p : params) {
				System.out.println("Params[" + i + "] Id = " + p.getId());
				System.out.println("Params[" + i + "] Name = " + p.getName());
				System.out.println("Params[" + i + "] Value = " + p.getValue());
				System.out.println("Params[" + i + "] Parent Id = " + p.getJob().getId());
				i++;
			}

		} catch (HibernateException e) {
			System.out.println("Error: " + e.getMessage());
		}
	}
	
	public void testRuleString()
	{
		Job j = new Job();		
		Rule rule = new Rule();
		RuleType rt = new RuleType();
		rt.setName("NDaysFromMetadata");
		rule.setType(rt);
		List<RuleParameter> paramList = new ArrayList<RuleParameter>();
		
		RuleParameter rp1 = new RuleParameter();
		rp1.setValue("1");
		paramList.add(rp1);
		RuleParameter rp2 = new RuleParameter();
		rp2.setValue("before");
		paramList.add(rp2);
		RuleParameter rp3 = new RuleParameter();
		rp3.setValue("$Title.CableLabsVOD1.1.License Start Date");
		paramList.add(rp3);
		RuleParameter rp4 = new RuleParameter();
		rp4.setValue("10:00 am");
		paramList.add(rp4);

		rule.setParams(paramList);		
		
		j.setRule(rule);
		
		System.out.println("Rule string for job: " + j.getScheduleRuleString());
	}
	
	public void testTitleAssociation()
	{
		Job j = new Job();
		Rule rule = new Rule();
		RuleType rt = new RuleType();
		rt.setTitlesAssociated(false);
		rule.setType(rt);		
		j.setRule(rule);
		
		System.out.println("Titles associated: " + j.isTitleAssociated());
	}
}
