/**
 * EveryNDays.java
 * Created on Jul 3, 2008
 * (C) Copyright TANDBERG Television Ltd.
 */
package com.tandbergtv.watchpoint.pmm.job.timers;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import com.tandbergtv.watchpoint.pmm.entities.RuleParameter;
import com.tandbergtv.watchpoint.pmm.entities.RuleParameterDataType;
import com.tandbergtv.watchpoint.pmm.entities.RuleTypeParameter;

/**
 * This class reads the job rule parameter to get the interval in terms of number of 
 * days and returns a result object which indicates that this is a periodic task
 * with periodicity = msec for N days.
 * It sets the start date time using the startdate and jobTime given. 
 * If the time is specified, uses it else defaults to midnight.
 * 
 * @author spuranik
 */
public class EveryNDays implements ITimeRepresentation {

	private static long MSEC_IN_ONE_DAY = 24L * 60L * 60L * 1000L;
	private static final Logger logger = Logger.getLogger(EveryNDays.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.tandbergtv.watchpoint.pmm.job.timers.ITimeRepresentation#getTime(java.util.List,
	 *      java.util.List)
	 */
	public Object getTime(List<RuleTypeParameter> ruleTypeParams, List<RuleParameter> params,
			Date startDate) {

		String numberOfDays = TimerHelper.getParameter(ruleTypeParams, params,
				RuleParameterDataType.INTEGER);
		String jobTime = TimerHelper.getParameter(ruleTypeParams, params,
				RuleParameterDataType.TIME);

		if (numberOfDays == null) {
			logger.error("Number of days not specified");
			return null;
		}
		if (Integer.parseInt(numberOfDays) == 0) {
			logger.error("Number of days cannot be 0");
			return null;
		}

		Date jobStartDate = TimerHelper.getStartDateTime(startDate, jobTime);
		long periodicity = Long.parseLong(numberOfDays) * MSEC_IN_ONE_DAY;
		TimerResult result = new TimerResult(true, periodicity, jobStartDate);
		return result;
	}
}
