package com.ejie.m62fb.utils.format;

import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

import com.ejie.m62fb.utils.constants.AppConstantes;

public class FormatUtils {

		/**
		 * Devuelve la fecha dada sumada o restada (dependiendo de si se le pasa un
		 * valor positibo o uno negativo) con los dias dados
		 * 
		 * @param fecha
		 *            Date
		 * @param dias
		 *            int
		 * @return Date
		 */
		public static Date addRemoveDaysToDate(Date fecha, int dias) {
			GregorianCalendar cal = new GregorianCalendar();
			cal.setTime(fecha);
			cal.add(Calendar.DATE, dias);
			return cal.getTime();
		}

		/**
		 * Formatea una fecha Date a una fecha String con el formato dado
		 * 
		 * @param fecha
		 *            Date
		 * @return String
		 * 
		 * @throws ParseException
		 *             e
		 */
		public static String formatFechaToString(Date fecha,
				SimpleDateFormat formatoFecha) {
			String resultado = "";
			if (fecha != null) {
				SimpleDateFormat dateFormat = formatoFecha;
				resultado = dateFormat.format(fecha);
			}
			return resultado;
		}

		/**
		 * Transforma un objeto a json para poder ser guardado como filtro
		 * 
		 * @param filtro
		 *            Object
		 * @return String
		 * @throws JsonGenerationException
		 *             e
		 * @throws JsonMappingException
		 *             e
		 * @throws IOException
		 *             e
		 */
		public static String objectToFilterJson(Object filtro)
				throws JsonGenerationException, JsonMappingException, IOException {
			ObjectMapper mapper = new ObjectMapper();
			mapper.setSerializationInclusion(Inclusion.NON_NULL);
			return mapper.writeValueAsString(filtro);
		}

		/**
		 * Transforma un objeto a json
		 * 
		 * @param filtro
		 *            Object
		 * @return String
		 * @throws JsonGenerationException
		 *             e
		 * @throws JsonMappingException
		 *             e
		 * @throws IOException
		 *             e
		 */
		public static String objectToJson(Object objeto)
				throws JsonGenerationException, JsonMappingException, IOException {
			ObjectMapper mapper = new ObjectMapper();
			return mapper.writeValueAsString(objeto);
		}

		/**
		 * Comprueba si un string es un numero
		 * 
		 * @param input
		 *            String
		 * @return boolean
		 */
		public static boolean isNumeric(String input) {
			try {
				Integer.parseInt(input);
				return true;
			} catch (NumberFormatException e) {
				// No es un numero
				return false;
			}
		}

		/**
		 * Devuelve el año de la fecha de tipo Date que le llega por parámetro.
		 * 
		 * @param fecha
		 *            Date
		 * @return BigDecimal
		 */
		public static BigDecimal getYearDate(Date fecha) {
			GregorianCalendar cal = new GregorianCalendar();
			cal.setTime(fecha);
			int anio = cal.get(Calendar.YEAR);
			return new BigDecimal(anio);
		}

		/**
		 * Redondea un double a dos decimales
		 * 
		 * @param number
		 *            double
		 * @return double redondeado a 2 decimales
		 */
		public static double round2DecimalDouble(double number) {
			return Math.round(number * Math.pow(NUM_10, 2))
					/ Math.pow(NUM_10, 2);
		}

		/**
		 * Metodo que añade 0 a un entero hasta que alcance la longitud deseada
		 * 
		 * @param param
		 *            String al que se añaden 0
		 * @param width
		 *            longitud deseada
		 * @return String cadena modificada
		 */
		public static String zeroPad(String param, int width) {
			StringBuffer result = new StringBuffer("");
			for (int i = 0; i < width - param.length(); i++) {
				result.append("0");
			}
			result.append(param);
			return result.toString();
		}

		/**
		 * Inserta ceros por la izquierda al valor BigDecimal recibido hasta al
		 * longitud que llega por parámetro.
		 * 
		 * @param valor
		 *            BigDecimal
		 * @param longitud
		 *            int
		 * @return String
		 */
		public static String rellenaCerosIzqdaBigD(BigDecimal valor, int longitud) {
			StringBuilder stb = new StringBuilder("");
			String valorS = String.valueOf(valor);

			int numCerosAnadir = longitud - valorS.length();
			for (int i = 0; i < numCerosAnadir; i++) {
				stb.append("0");
			}
			stb.append(valor);
			return stb.toString();
		}

		public static String parseToFechaFormateada(long timeStamp, String mascara)
				throws ParseException {
			SimpleDateFormat sdf = new SimpleDateFormat(mascara);
			Date date = new Date(new Long(timeStamp).longValue());
			return sdf.format(date);
		}

		public static String parseToFechaFormateada(Date date, String mascara)
				throws ParseException {
			SimpleDateFormat sdf = new SimpleDateFormat(mascara);
			return sdf.format(date);
		}

		public static Date parseToFechaFormateada(String dateInString, String mascara)
		throws ParseException {
			SimpleDateFormat sdf = new SimpleDateFormat(mascara);
			Date date = sdf.parse(dateInString);
			return date;
		}
		
//		public static void main (String args[]){
//			Utilidades utils = new Utilidades();
//			Date fechaParseada=null;
//			try {
//				String fecha = "130315";
//				fecha = fecha.substring(0, 2).concat("/").concat(fecha.substring(2,4)).concat("/").concat(fecha.substring(4,6));
//				fechaParseada=utils.parseToFechaFormateada(fecha, N55ebConstantes.FORMATO_FECHAS_BD);
//			} catch (ParseException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			System.out.println(fechaParseada);
//			
//		}
		/**
		 * Convertir las entidades HTML en acentos
		 * 
		 * @param str
		 *            String
		 * @return String
		 */
		public static String replaceAcutesHTML(String str) {
			str = str.replaceAll("&aacute;", "á");
			str = str.replaceAll("&eacute;", "é");
			str = str.replaceAll("&iacute;", "í");
			str = str.replaceAll("&oacute;", "ó");
			str = str.replaceAll("&uacute;", "ú");
			str = str.replaceAll("&Aacute;", "Á");
			str = str.replaceAll("&Eacute;", "É");
			str = str.replaceAll("&Iacute;", "Í");
			str = str.replaceAll("&Oacute;", "Ó");
			str = str.replaceAll("&Uacute;", "Ú");
			str = str.replaceAll("&ntilde;", "ñ");
			str = str.replaceAll("&Ntilde;", "Ñ");

			return str;
		}

		/**
		 * Formatea una cadena de la que se espera que contenga un decimal. Si la
		 * cadena pasada como parametro es nula o vacia devolverá null.
		 * 
		 * @param cadena
		 *            convierte una cadena a numero decimal
		 * @return Decimal formateado
		 */
		public static BigDecimal convertirADecimal(String cadena) {
			BigDecimal decimal = null;
			if (cadena != null && cadena.trim().length() > 0) {
				String nuevaCad = cadena.replace(".", "");
				try {
					decimal = new BigDecimal(nuevaCad.replace(",", "."));
				} catch (NumberFormatException nfe) {
					decimal = null;
				}
			}
			return decimal;
		}

		/**
		 * Convierte un valor decimal a su representacion en String
		 * 
		 * @param number
		 *            BigDecimal decimal que se quiere formatear
		 * @param numDecimales
		 *            int maximo numero de decimales
		 * @return String cadena que representa el decimal
		 */
		public static String bigDecimalToString(BigDecimal number, int numDecimales) {
			String res = "";
			try {
				if (number != null) {
					DecimalFormat df = new DecimalFormat("#,##0.00",
							new DecimalFormatSymbols(AppConstantes.ES_LOCALE));
					df.setMinimumFractionDigits(numDecimales);
					df.setMaximumFractionDigits(numDecimales);
					res = df.format(number);
				}
			} catch (IllegalArgumentException e) {
				res = "";
			}
			return res;
		}
		// Numeros mágicos
		public static final int NUM_0x7F = 0x7F;
		public static final int NUM_NEG_1 = -1;
		public static final int NUM_0 = 0;
		public static final int NUM_1 = 1;
		public static final int NUM_2 = 2;
		public static final int NUM_3 = 3;
		public static final int NUM_4 = 4;
		public static final int NUM_5 = 5;
		public static final int NUM_6 = 6;
		public static final int NUM_7 = 7;
		public static final int NUM_8 = 8;
		public static final int NUM_9 = 9;
		public static final int NUM_10 = 10;
		public static final int NUM_11 = 11;
		public static final int NUM_12 = 12;
		public static final int NUM_13 = 13;
		public static final int NUM_14 = 15;
		public static final int NUM_15 = 15;
		public static final int NUM_16 = 16;
		public static final int NUM_19 = 19;
		public static final int NUM_40 = 40;
		public static final int NUM_97 = 97;
		public static final int NUM_100 = 100;
		public static final int NUM_128 = 128;
		public static final int NUM_200 = 200;
		public static final int NUM_255 = 255;
		public static final int NUM_300 = 300;
		public static final int NUM_1000 = 1000;
		public static final int NUM_1024 = 1024;
		public static final int NUM_3000 = 3000;
		public static final int NUM_4000 = 4000;
	}
