/**
 * JobManager.java
 * Created on May 15, 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 com.tandbergtv.watchpoint.pmm.dao.hibernate.HibernateContext;
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.watchpoint.pmm.entities.RuleTypeParameter;
import com.tandbergtv.watchpoint.pmm.job.IJobManager;
import com.tandbergtv.watchpoint.pmm.job.JobManager;
import com.tandbergtv.workflow.core.ProcessPriority;

import junit.framework.TestCase;

/**
 * unit tests for job manager class
 * 
 * @author spuranik
 */
public class JobManagerTest extends TestCase {

	// private static final Logger logger = Logger.getLogger(JobManagerTest.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see junit.framework.TestCase#setUp()
	 */
	@Override
	protected void setUp() throws Exception {
		try {
			HibernateContext.getContext().initializeContext();
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
		super.setUp();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see junit.framework.TestCase#tearDown()
	 */
	@Override
	protected void tearDown() throws Exception {
		try {
			HibernateContext.getContext().closeContext();
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
		super.tearDown();
	}

	public void _testGettingAllRuleTypes() {
		try {
			IJobManager jm = JobManager.getInstance();
			List<RuleType> ruleTypes = jm.getAllRuleTypes();
			for (RuleType rt : ruleTypes) {
				System.out.println("Rule Type Id: " + rt.getId());
				System.out.println("Rule Type Name: " + rt.getName());
				System.out.println("Rule Type isAssociated with titles: "
						+ rt.getTitlesAssociated());
				List<RuleTypeParameter> params = rt.getParams();
				for (RuleTypeParameter p : params) {
					System.out.println("Rule Type Param Id: " + p.getId());
					System.out.println("Rule Type Param Order: " + p.getOrder());
					System.out.println("Rule Type Param Type: " + p.getType());
				}
			}
			System.out.println("Done");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	public void _testGettingJob() {
		try {
			IJobManager jm = JobManager.getInstance();
			long jobId = 18;
			Job j = jm.getJob(jobId);
			System.out.println(j.getClass().getName());
			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("RuleParams[" + i + "] Id = " + p.getId());
				System.out.println("RuleParams[" + i + "] Order = " + p.getOrder());
				System.out.println("RuleParams[" + i + "] Value = " + p.getValue());
				System.out.println("RuleParams[" + i + "] Parent Id = " + p.getRule().getId());
				i++;
			}

			List<JobParameter> params = j.getJobParams();
			i = 0;
			for (JobParameter p : params) {
				System.out.println("JobParams[" + i + "] Id = " + p.getId());
				System.out.println("JobParams[" + i + "] Name = " + p.getName());
				System.out.println("JobParams[" + i + "] Value = " + p.getValue());
				System.out.println("JobParams[" + i + "] Parent Id = " + p.getJob().getId());
				i++;
			}
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}

	public void _testJobCreation() {
		try {
			// create a job object
			Job j = new Job();
			j.setName("Job1");
			j.setPriority(ProcessPriority.NORMAL);
			j.setTemplateName("Test template");

			// 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);

			// set the context for this job
			Context c = new Context();
			long contextId = 1;
			c.setId(contextId);
			j.setContext(c);

			IJobManager jm = JobManager.getInstance();
			RuleType rt = jm.getRuleType("NDaysFromMetadata");
			j.getRule().setType(rt);
			jm.createJob(j);
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}

	public void _testGettingRuleType() {
		try {
			IJobManager jm = JobManager.getInstance();
			RuleType rt = jm.getRuleType("NDaysFromMetadata");

			System.out.println("Rule Type Id: " + rt.getId());
			System.out.println("Rule Type Name: " + rt.getName());
			System.out.println("Rule Type isAssociated with titles: " + rt.getTitlesAssociated());
			List<RuleTypeParameter> params = rt.getParams();
			for(int i=0; i < params.size(); i++)
			{
				RuleTypeParameter p = params.get(i);
				System.out.println("Rule Type Param Id: " + p.getId());
				System.out.println("Rule Type Param Order: " + p.getOrder());
				System.out.println("Rule Type Param Type: " + p.getType().toString());
			}
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}

	public void _testUpdatingJob() {
		try {
			IJobManager jm = JobManager.getInstance();
			long jobId = 1;
			Job j = jm.getJob(jobId);
			j.setName("Revised Job1");
			jm.updateJob(j);
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}

	public void testDelete() {
		try {
			IJobManager jm = JobManager.getInstance();
			long jobId = 18;
			jm.deleteJob(jobId);
			System.out.println("done deleting job");
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}

	public void _testGettingAllJobs() {
		try {
			IJobManager jm = JobManager.getInstance();
			long contextId = 1;
			List<Job> jobs = jm.getAllJobs(contextId);

			if (jobs.size() == 0)
				System.out.println("No jobs found for context Id: " + contextId);

			for (Job j : jobs) {
				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("RuleParams[" + i + "] Id = " + p.getId());
					System.out.println("RuleParams[" + i + "] Order = " + p.getOrder());
					System.out.println("RuleParams[" + i + "] Value = " + p.getValue());
					System.out.println("RuleParams[" + i + "] Parent Id = " + p.getRule().getId());
					i++;
				}

				List<JobParameter> params = j.getJobParams();
				i = 0;
				for (JobParameter p : params) {
					System.out.println("JobParams[" + i + "] Id = " + p.getId());
					System.out.println("JobParams[" + i + "] Name = " + p.getName());
					System.out.println("JobParams[" + i + "] Value = " + p.getValue());
					System.out.println("JobParams[" + i + "] Parent Id = " + p.getJob().getId());
					i++;
				}
			}
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}

	public void _testGettingRuleTypeWithTitles() {
		try {
			IJobManager jm = JobManager.getInstance();
			List<RuleType> rules = jm.getRuleTypes(true);

			for (RuleType rt : rules) {
				System.out.println("Rule Type Id: " + rt.getId());
				System.out.println("Rule Type Name: " + rt.getName());
				System.out.println("Rule Type isAssociated with titles: "
						+ rt.getTitlesAssociated());
				List<RuleTypeParameter> params = rt.getParams();
				for (RuleTypeParameter p : params) {
					System.out.println("Rule Type Param Id: " + p.getId());
					System.out.println("Rule Type Param Order: " + p.getOrder());
					System.out.println("Rule Type Param Type: " + p.getType());
				}
			}
		} catch (RuntimeException e) {
			System.out.println(e.getMessage());
		}
	}
}
