package br.com.totvs.plugins.dummyplugin;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import org.apache.log4j.Logger;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import br.com.totvs.exceptions.ConfigException;
import br.com.totvs.exceptions.InfraException;
import br.com.totvs.exceptions.LayoutException;
import br.com.totvs.plugins.PluginConfig;
import br.com.totvs.plugins.PluginInterface;

/**
 * Classe dummy para testes de tipos de dados, execucao de politicas, etc.
 * <p>
 * @author claudio cardozo
 * @author ccardozo -- refatorado para usar o novo modelo do server
 *
 */
public class DummyPlugin implements PluginInterface {

	/**
	 * Pega o nome do Plugin Externo; especializado em pegar o nome do acesso
	 * @param hashIn Um map com as variaveis de entrada e seus valores
	 * @return hashOut Um map com as variaveis de saida do plugin
	 * @exception InfraException, LayoutException, ConfigException, arremessa uma de. 
	 */
	public Map<String, Object> execute(Map<String, Object> hashIn) throws InfraException, LayoutException, ConfigException {
		
		// definicao de contextos locais para logging; use o nome que quiser!
		// eu estou usando o proprio nome da classe com o package junto.
		// -----------
		// IMPORTANTE! A dependecia log4j jah disponivel no package, use-o!
		// -----------
		Logger log = Logger.getLogger(DummyPlugin.class);
		log.info(">> DummyPlugin.execute(): Executando acesso 'DummyPlugin'...");
		
		// map para retornar os registros formatados <K,V> para quem me chamou
		Map<String, Object> hashOut = null;

		try {
			// forma simples e rapida de pegar as propriedades do plugin
			// armazenadas no JSON de configuracao dos plugins;
			// Use PluginConfig.getDetails(nome_do_plugin, nome_da_propriedade/details) para pegar propriedades do layout
			// -----------
			// IMPORTANTE! As dependências do Jackson JSON estao disponiveis, use-o!
			// -----------
			String jsonOut = PluginConfig.getDetails("dummyplugin", "properties");
			ObjectMapper mapper = new ObjectMapper();
			Map<String, Object> config = mapper.readValue(jsonOut, new TypeReference<Map<String,Object>>(){});
			// -----------
			
			// verifica a existencia dos campos de entrada no map do acesso
			String cpf = (String) hashIn.get("CPF");
			if (cpf == null) {
				log.error("Nao tem CPF na hash de entrada");
				throw new LayoutException("Faltando 'CPF' na hash de entrada");
			}
			log.debug(">>DummyPlugin.execute: CPF [" + cpf + "]");
			
			hashOut = new HashMap<String, Object>();
			// insere na hash de saida uma variavel de cada tipo tratado na politica de credito
			hashOut.put("BOOLEAN_VALUE", Boolean.TRUE);
			
			// NÂO PODE FORMATAR DATA dentro do plugin, isso eh feito fora pelo layout
			// NÃO --> SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy", Locale.ENGLISH);
			// NÃO --> hashOut.put("DATE_VALUE", (String) formatter.format(new Date()));
			hashOut.put("DATE_VALUE", new Date());
			
			hashOut.put("DOUBLE_VALUE", Double.MAX_VALUE);
			hashOut.put("INTEGER_VALUE", Integer.MAX_VALUE);
			hashOut.put("STRING_VALUE", "DUMMY");
			// putting some snappets
			hashOut.put("D100_NOME", "Claudio dos Anzoes Pereira");
			// NÂO PODE FORMATAR DATA dentro do plugin, isso eh feito fora pelo layout (veja acima!)
			hashOut.put("D100_DTNASCIMENTO", new Date());
			hashOut.put("D100_MYDIR", config.get("database")); // para testar se pegou essa property
			hashOut.put("D100_OUTRO", config.get("usuario"));
			// more some snappets
			hashOut.put("D200_NUMCONSULTAS", 3D);
			hashOut.put("D200_TIPO_1", "TIPO1");
			// NÂO PODE FORMATAR DATA dentro do plugin, isso eh feito fora pelo layout
			hashOut.put("D200_DATA_1", new Date());
			hashOut.put("D200_HORA_1", "21:59:59");
			hashOut.put("D200_MOEDA_1", "R$");
			hashOut.put("D200_VALOR_1", 100.01);
			hashOut.put("D200_TIPO_2", config.get("senha"));
			// NÂO PODE FORMATAR DATA dentro do plugin, isso eh feito fora pelo layout
			hashOut.put("D200_DATA_2", new Date());
			hashOut.put("D200_HORA_2", "22:59:59");
			hashOut.put("D200_MOEDA_2", "U$");
			hashOut.put("D200_VALOR_2", 200.02);
			hashOut.put("D200_TIPO_3", "TIPO3");
			// NÂO PODE FORMATAR DATA dentro do plugin, isso eh feito fora pelo layout
			hashOut.put("D200_DATA_3", new Date());
			hashOut.put("D200_HORA_3", "23:59:59");
			hashOut.put("D200_MOEDA_3", "LB");
			hashOut.put("D200_VALOR_3", 300.03);
			
			hashOut.put("LPT__PLUGIN_ENVIO", "STRING REQUEST");
			hashOut.put("LPT__PLUGIN_RETORNO", "STRING RETORNO");
			
		} catch (LayoutException e) {
			log.error("<< DummyPlugin.execute(): LayoutException do acesso 'DummyAccess'...", e);
			throw new ConfigException(e.getMessage());
			// throw e; // joga a mesma exception pra quem chamou
		} catch (Exception e) {
			log.error("<< DummyPlugin.execute(): Exception do acesso 'DummyPlugin'...", e);
		} finally {
			log.info("DummyPlugin HashOut : " + hashOut);
			log.info("<< DummyPlugin.execute(): Saindo do acesso 'DummyPlugin'...");
		}
		
		return hashOut;
	}
	
	
	public static void main(String[] args) {
		SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy", Locale.ENGLISH);
		System.out.println("format: "+formatter.format(new Date()));
	}
}
