package com.rjconsultores.ventaboletos.utilerias;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LocalizadorHelper {
	private static Logger log = LogManager.getLogger(LocalizadorHelper.class);

	private Map<String, String> mapa = new HashMap<String, String>(0);

	public LocalizadorHelper() {
		mapa.put("1", "GO");
		mapa.put("2", "JM");
		mapa.put("3", "LQ");
		mapa.put("4", "HU");
		mapa.put("5", "NS");
		mapa.put("6", "RV");
		mapa.put("7", "XP");
		mapa.put("8", "IY");
		mapa.put("9", "KZ");
		mapa.put("0", "WT");
	}

	public String getLocalizadorAlfa(final String localizador) {
		String valor = localizador.substring(2, localizador.length());
		String alfa = Long.toHexString(Integer.valueOf(valor)).toUpperCase();

		String novo = "";

		Random gerador = new Random();

		for (int idx = 0; idx < alfa.length(); idx++) {
			String digito = alfa.substring(idx, idx + 1);

			if (mapa.containsKey(digito)) {
				String mascara = mapa.get(digito);

				int r = gerador.nextInt(2);

				novo += mascara.substring(r, r + 1);
			} else {
				novo += digito;
			}
		}

		return novo;
	}

	public String getLocalizadorReal(final String localizador) {

		if (StringUtils.isBlank(localizador)) {
			return localizador;
		}

		try {
			String novo = "";

			for (int idx = 0; idx < localizador.length(); idx++) {
				String digito = localizador.substring(idx, idx + 1);
				digito = digito.toUpperCase();

				if (!"ABCDEF1234567890".contains(digito)) {
					for (Map.Entry<String, String> entry : mapa.entrySet()) {
						String chave = entry.getKey();
						String valor = entry.getValue();

						if (valor.contains(digito)) {
							novo += chave;
							break;
						}
					}
				} else {
					novo += digito;
				}
			}

			return "01" + String.format("%010d", Long.parseLong(novo, 16));

		} catch (Exception e) {
			log.error("Localizador invalido: " + localizador, e);

			return "010000000000";
		}
	}

	public String getLocalizadorRealEmbarcada(final String localizador) {

		if (StringUtils.isBlank(localizador)) {
			return localizador;
		}

		try {
			String novo = "";

			for (int idx = 0; idx < localizador.length(); idx++) {
				String digito = localizador.substring(idx, idx + 1);
				digito = digito.toUpperCase();

				if (!"ABCDEF1234567890".contains(digito)) {
					for (Map.Entry<String, String> entry : mapa.entrySet()) {
						String chave = entry.getKey();
						String valor = entry.getValue();

						if (valor.contains(digito)) {
							novo += chave;
							break;
						}
					}
				} else {
					novo += digito;
				}
			}

			return String.format("%010d", Long.parseLong(novo, 16));

		} catch (Exception e) {
			log.error("Localizador invalido: " + localizador, e);

			return "010000000000";
		}
	}

	public String getLocalizadorAlfaEmbarcada(final String localizador) {
		if (StringUtils.isBlank(localizador) || StringUtils.isAlpha(localizador)) {
			return localizador;
		}

		String valor = localizador.substring(0, localizador.length());
		String alfa = Long.toHexString(Integer.valueOf(valor)).toUpperCase();

		String novo = "";

		Random gerador = new Random();

		for (int idx = 0; idx < alfa.length(); idx++) {
			String digito = alfa.substring(idx, idx + 1);

			if (mapa.containsKey(digito)) {
				String mascara = mapa.get(digito);

				int r = gerador.nextInt(2);

				novo += mascara.substring(r, r + 1);
			} else {
				novo += digito;
			}
		}

		return novo;
	}
}
