package com.rjconsultores.ventaboletos.utilerias;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TimeZoneUtil {
	
	private static Logger log = LogManager.getLogger(TimeZoneUtil.class);
	
	/**
	 * Ajusta o timezone conforme a origem ou ponto de venda informado de acordo com o horario de verao e fuso horario,
	 * nao alterando a data informada, apenas o GMT
	 * 
	 * Retorna a data formatada para envio do BPe
	 * 
	 * @param puntoventaId
	 * @param paradaId
	 * @param data
	 * @return
	 */
	public static String ajustarTimeZone(Map<String, Integer> mConfiguracoesFusoHorario, Date data) {
		try {
			Integer gmtBrasil = -3;
			
			if(mConfiguracoesFusoHorario != null) {
				StringBuilder sDataBpeFormatada = new StringBuilder(DateUtil.getStringDate(data, "yyyy-MM-dd'T'HH:mm:ss"));
				Integer tiempohorhuso = mConfiguracoesFusoHorario.get("tiempohorhuso");
				
				if (tiempohorhuso != null) {
					gmtBrasil += tiempohorhuso;
				}
				Integer tiempohorverano = mConfiguracoesFusoHorario.get("tiempohorverano");
				
				if (tiempohorverano != null) {
					gmtBrasil += tiempohorverano;
				}
				
				StringBuilder sGmtBrasil = new StringBuilder();
				if(gmtBrasil >= 0) {
					sGmtBrasil.append("+");
				}
				sGmtBrasil.append(gmtBrasil.toString());

				if(gmtBrasil.toString().length() <= 2) {
					sGmtBrasil.insert(1, "0");
				}
				sDataBpeFormatada.append(sGmtBrasil).append(":00");
				
				return sDataBpeFormatada.toString();
			}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return DateUtil.dataFormatoBPe(data);
	}
	
	/**
	 * Ajusta o timezone da data de acordo com a diferença da agencia de venda com a origem da viagem.
	 * @param puntoventaId
	 * @param paradaId
	 * @param data
	 * @return
	 */
	public static String ajustarPuntoVentaEmissaoOrigemViagemTimeZone(Map<String, Integer> mConfiguracoesFusoHorarioParada, Map<String, Integer> mConfiguracoesFusoHorarioPuntoVenta, Date data) {
		try {
			Integer gmtParada = -3;
			Integer gmtPuntoventa = -3;
			
			if(mConfiguracoesFusoHorarioParada != null) {
				Integer tiempohorhuso = mConfiguracoesFusoHorarioParada.get("tiempohorhuso");
				
				if (tiempohorhuso != null) {
					gmtParada += tiempohorhuso;
				}
				Integer tiempohorverano = mConfiguracoesFusoHorarioParada.get("tiempohorverano");
				
				if (tiempohorverano != null) {
					gmtParada += tiempohorverano;
				}
			}
			
			if(mConfiguracoesFusoHorarioPuntoVenta != null) {
				Integer tiempohorhuso = mConfiguracoesFusoHorarioPuntoVenta.get("tiempohorhuso");
				
				if (tiempohorhuso != null) {
					gmtPuntoventa += tiempohorhuso;
				}
				Integer tiempohorverano = mConfiguracoesFusoHorarioPuntoVenta.get("tiempohorverano");
				
				if (tiempohorverano != null) {
					gmtPuntoventa += tiempohorverano;
				}
			}
			
			Integer qtdHoraAjustaData = new BigDecimal(gmtPuntoventa).abs().intValue() - new BigDecimal(gmtParada).abs().intValue();
			Calendar cal = Calendar.getInstance();
			cal.setTime(data);
			cal.add(Calendar.HOUR_OF_DAY, qtdHoraAjustaData);
			
			StringBuilder sDataBpeFormatada = new StringBuilder(DateUtil.getStringDate(cal.getTime(), "yyyy-MM-dd'T'HH:mm:ss"));
			
			StringBuilder sGmtData = new StringBuilder();
			if(gmtParada >= 0) {
				sGmtData.append("+");
			}
			sGmtData.append(gmtParada.toString());
		  
			if(gmtParada.toString().length() <= 2) {
				sGmtData.insert(1, "0");
			}
			
			sDataBpeFormatada.append(sGmtData).append(":00");
		  
			return sDataBpeFormatada.toString();

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return DateUtil.dataFormatoBPe(data);
	}

}
