package com.fp.persistence.commondb.helper;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.fp.common.helper.CalculationBase;

/**
 * Enumeracion que almacena las distintas frecuencias de calculo de la aplicacion. 
 * @author Jorge Vaca.
 * @version 2.1
 *
 */
public enum Frequency {
	DAYLY(1,1), WEEKLY(2,7), BIWEEKLY(3,15), MONTHLY(4,-1), BIMONTHLY(5,-2), TRIMONTHLY(6,-3), 
	SEMESTRAL(7,-6), ANNUAL(8,-12);
	
	private int numDays;
	private Integer code;
	
	/**
	 * Crea una nueva frecuencia. El valor negativo -1 indica 1 mes, -2 indica 2 meses... Etc. 
	 * @param pCode	Código de frecuencia. 
	 * @param pDays	Días de la frecuencia. 
	 */
	private Frequency(int pCode, int pDays) {
		this.numDays = pDays;
		this.code = pCode;
	}

	/**
	 * Entrega el Valor de numDays.
	 * @return numDays.
	 */
	public int getNumDays(Date pDate,SimpleDateFormat sdf) throws Exception {
		int data = numDays;
		if (data < 0) {			
			data = data * -1;			
			APPDates d = new APPDates(pDate,CalculationBase.B365365,sdf);
			d.addField(Calendar.MONTH, data);
			APPDates a = new APPDates(pDate,CalculationBase.B365365,sdf);
			data = d.substract(a);
		}		
		return data;
	}
	
	/**
	 * Entraga un objeto Frecuency dado el codigo de frecuencia. 
	 * @param pCode		Código de frecuencia. 
	 * @return  Frequency
	 * @throws Exception
	 */
	public static Frequency getFrecuency(Integer pCode) throws Exception{
		Frequency [] bt = null; 
		bt = Frequency.values();
		Frequency  btype = null; 
		for(Frequency obj : bt){
		  if(obj.code.compareTo(pCode) == 0){
		    btype =  obj;
		  }
		}
		return btype;   
	}

	/**
	 * Entrega el valor de: code
	 * @return  Integer
	 */
	public Integer getCode() {
		return code;
	}
	
	

}
