/**
 * OnDayEveryNWeeks.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 interval between weeks and returns a result object which has periodicity =
 * msec in N weeks. 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 EveryNWeeks implements ITimeRepresentation {

	private static int DAYS_IN_WEEK = 7;
	private static long MSEC_IN_ONE_DAY = 24L * 60L * 60L * 1000L;

	private static final Logger logger = Logger.getLogger(EveryNWeeks.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 numberOfWeeks = TimerHelper.getParameter(ruleTypeParams, params,
				RuleParameterDataType.INTEGER);
		// interval between the weeks is required.
		if (numberOfWeeks == null) {
			logger.error("NumberOfWeeks is not specified.");
			return null;
		}
		if (Integer.parseInt(numberOfWeeks) == 0) {
			logger.error("NumberOfWeeks cannot be 0.");
			return null;
		}

		String jobTime = TimerHelper.getParameter(ruleTypeParams, params,
				RuleParameterDataType.TIME);
		Date jobStartDate = TimerHelper.getStartDateTime(startDate, jobTime);
		// Could have reused 'EveryNDays' timer for this but not doing so,
		// because I will have to change the number of days in the ruleparams 
		// and then send it. So not going thru all that.
		int numberOfDays = Integer.parseInt(numberOfWeeks) * DAYS_IN_WEEK;
		long periodicity = numberOfDays * MSEC_IN_ONE_DAY;
		TimerResult result = new TimerResult(true, periodicity, jobStartDate);
		return result;
	}
}
