package com.rjconsultores.ventaboletos.enums;

import org.apache.commons.lang.StringUtils;
import org.brazilutils.br.cpfcnpj.Cnpj;
import org.brazilutils.br.cpfcnpj.Cpf;
import org.brazilutils.validation.ValidationException;

/**
 **Criar Enumns com quantidade máxima de 10 caracteres, pois existe uma restrição com a Globus (Praxio)
 ***/

public enum TipoIdentificacionDoc {
	RG(1),
	CPF(2),
	CI(12),
	PASPT(13),
	RUT(14),
	DOCX(22),
	CNPJ(15),
	CN(23),
	RNE(24),
	DOC_IDOSO(25),
	DNI(26),
	RE_PM(27),
	D_FISICO(28),
	J_CARENTE(29),
	GRATUIDADE(30),
	NIS(31),
	PASSELIVRE(32),
	ID_JOVEM(33),
	TODOS(0);

	private Integer id;

	private TipoIdentificacionDoc(Integer id) {
		this.id = id;
	}

	public Integer getId() {
		return this.id;
	}

	public static TipoIdentificacionDoc getById(Byte id) {
		if (id == null) {
			return null;
		}
		TipoIdentificacionDoc tmp = null;
		switch (id.intValue()) {
		case 1:
			tmp = TipoIdentificacionDoc.RG;
			break;
		case 2:
			tmp = TipoIdentificacionDoc.CPF;
			break;
		case 12:
			tmp = TipoIdentificacionDoc.CI;
			break;
		case 13:
			tmp = TipoIdentificacionDoc.PASPT;
			break;
		case 14:
			tmp = TipoIdentificacionDoc.RUT;
			break;
		case 22:
			tmp = TipoIdentificacionDoc.DOCX;
			break;
		case 15:
			tmp = TipoIdentificacionDoc.CNPJ;
			break;
		case 23:
			tmp = TipoIdentificacionDoc.CN;
			break;
		case 24:
			tmp = TipoIdentificacionDoc.RNE;
			break;		
		case 25:
			tmp = TipoIdentificacionDoc.DOC_IDOSO;
			break;
		case 26:
			tmp = TipoIdentificacionDoc.DNI;
			break;
		case 27:
			tmp = TipoIdentificacionDoc.RE_PM;
			break;
		case 28:
			tmp = TipoIdentificacionDoc.D_FISICO;
			break;
		case 29:
			tmp = TipoIdentificacionDoc.J_CARENTE;
			break;
		case 31:
			tmp = TipoIdentificacionDoc.NIS;
			break;
		case 32:
			tmp = TipoIdentificacionDoc.PASSELIVRE;
			break;
		case 33:
			tmp = TipoIdentificacionDoc.ID_JOVEM;
			break;

		default:
			break;
		}
		return tmp;
	}
	
	public static TipoIdentificacionDoc[] getTodos() {
		return new TipoIdentificacionDoc[]{TipoIdentificacionDoc.RG,
										   TipoIdentificacionDoc.CPF,
										   TipoIdentificacionDoc.CI,
										   TipoIdentificacionDoc.PASPT,
										   TipoIdentificacionDoc.RUT,
										   TipoIdentificacionDoc.DOCX,
										   TipoIdentificacionDoc.CNPJ,
										   TipoIdentificacionDoc.CN,
										   TipoIdentificacionDoc.RNE,
										   TipoIdentificacionDoc.DOC_IDOSO,
										   TipoIdentificacionDoc.DNI,
										   TipoIdentificacionDoc.RE_PM,
										   TipoIdentificacionDoc.D_FISICO,
										   TipoIdentificacionDoc.J_CARENTE,
										   TipoIdentificacionDoc.GRATUIDADE,
										   TipoIdentificacionDoc.NIS,
										   TipoIdentificacionDoc.PASSELIVRE,
										   TipoIdentificacionDoc.ID_JOVEM
										  };
	}
	
	

	public static String getDescricao(Byte id) {
		if (id == null) {
			return null;
		}
		String descricao = "";
		
		switch (id) {
		case 1: case 10:
			descricao= "RG";
			break;
		case 2: case 11:
			descricao= "CPF";
			break;
		case 12:
			descricao= "CI";
			break;
		case 13:
			descricao= "PASPT";
			break;
		case 14:
			descricao= "RUT";
			break;
		case 22:
			descricao= "DOCX";
			break;
		case 15:
			descricao= "CNPJ";
			break;
		case 23:
			descricao= "CN";
			break;
		case 24:
			descricao= "RNE";
			break;
		case 25:
			descricao= "DOC_IDOSO";
			break;
		case 26:
			descricao= "DNI";
			break;
		case 27:
			descricao= "RE_PM";
			break;
		case 28:
			descricao= "D_FISICO";
			break;
		case 29:
			descricao= "J_CARENTE";
			break;
		case 30:
			descricao= "GRATUIDADE";
			break;
		case 31:
			descricao= "NIS";
			break;
		case 32:
			descricao= "PASSELIVRE";
			break;
		case 33:
			descricao= "ID_JOVEM";
			break;
		default:
			descricao= "";
			break;
		}
		return descricao.length()> 10 ? descricao.substring(0,10) : descricao;
	}
	
	public static TipoIdentificacionDoc[] getTipoDocExcluindoCPF() {
		return new TipoIdentificacionDoc[]{TipoIdentificacionDoc.RG,
										   TipoIdentificacionDoc.CI,
										   TipoIdentificacionDoc.PASPT,
										   TipoIdentificacionDoc.RUT,
										   TipoIdentificacionDoc.DOCX,
										   TipoIdentificacionDoc.CNPJ,
										   TipoIdentificacionDoc.CN,
										   TipoIdentificacionDoc.RNE,
										   TipoIdentificacionDoc.DOC_IDOSO,
										   TipoIdentificacionDoc.DNI,
										   TipoIdentificacionDoc.RE_PM,
										   TipoIdentificacionDoc.NIS,
										   TipoIdentificacionDoc.PASSELIVRE,
										   TipoIdentificacionDoc.ID_JOVEM,
										   TipoIdentificacionDoc.D_FISICO,
										   TipoIdentificacionDoc.J_CARENTE
										  };
	}
	
	public static TipoIdentificacionDoc getTipo(String descTipoDoc) {
		if(descTipoDoc != null) {
			if(descTipoDoc.equals("RG")) {
				return TipoIdentificacionDoc.RG;
			} else if(descTipoDoc.equals("CPF")) {
				return TipoIdentificacionDoc.CPF;
			} else if(descTipoDoc.equals("CI")) {
				return TipoIdentificacionDoc.RG;
			} else if(descTipoDoc.equals("PASPT")) {
				return TipoIdentificacionDoc.PASPT;
			} else if(descTipoDoc.equals("RUT")) {
				return TipoIdentificacionDoc.RUT;
			} else if(descTipoDoc.equals("DOCX")) {
				return TipoIdentificacionDoc.DOCX;
			} else if(descTipoDoc.equals("CNPJ")) {
				return TipoIdentificacionDoc.CNPJ;
			} else if(descTipoDoc.equals("CN")) {
				return TipoIdentificacionDoc.CN;
			} else if(descTipoDoc.equals("RNE")) {
				return TipoIdentificacionDoc.RNE;
			} else if(descTipoDoc.equals("DOC_IDOSO")) {
				return TipoIdentificacionDoc.DOC_IDOSO;
			} else if(descTipoDoc.equals("DNI")) {
				return TipoIdentificacionDoc.DNI;
			}else if(descTipoDoc.equals("RE_PM")) {
				return TipoIdentificacionDoc.RE_PM;
			}else if(descTipoDoc.equals("NIS")) {
				return TipoIdentificacionDoc.NIS;
			}
			// mantendo a retrocompatibilidade
			else if(descTipoDoc.equals("PASSE_LIVRE") || descTipoDoc.equals("PASSELIVRE")) {
				return TipoIdentificacionDoc.PASSELIVRE;
			}else if(descTipoDoc.equals("ID_JOVEM")) {
				return TipoIdentificacionDoc.ID_JOVEM;
			}else if(descTipoDoc.equals("D_FISICO")) {
				return TipoIdentificacionDoc.D_FISICO;
			}else if(descTipoDoc.equals("J_CARENTE")) {
				return TipoIdentificacionDoc.J_CARENTE;
			}else {
				return null;
			}
		}
		
		return null;
	}
	
	public static boolean isExisteTipoIdentificacionDoc(String descTipoDoc) {
		return getTipo(descTipoDoc) != null;
	}
	
	public static boolean isRGBPeValido(String value) {
		return value == null ? false : value.trim().matches("\\d.*\\d.*|[a-zA-Z]+\\d.*\\d.*");
	}
	
	public static boolean isCPFValido(String doc) {
		try {
			String tmp = StringUtils.isBlank(doc) ? "" : doc;
			Cpf cpf = new Cpf(tmp.trim());
			
			return cpf.isValid();
		} catch (ValidationException e1) {
			return false;
		}
	}
	
	public static boolean isCNPJValido(String doc) {
		try {
			String tmp = StringUtils.isBlank(doc) ? "" : doc;
			Cnpj cnpj = new Cnpj(tmp.trim());
			
			return cnpj.isValid();
		} catch (ValidationException e1) {
			return false;
		}
	}
	
	public static boolean isRUTValido(String rut) {
		boolean validacion = false;
		try {
			rut = rut.toUpperCase();
			rut = rut.replace(".", "");
			rut = rut.replace("-", "");
			int rutAux = Integer.parseInt(rut.substring(0, rut.length() - 1));

			char dv = rut.charAt(rut.length() - 1);

			int m = 0, s = 1;
			for (; rutAux != 0; rutAux /= 10) {
				s = (s + rutAux % 10 * (9 - m++ % 6)) % 11;
			}
			if (dv == (char) (s != 0 ? s + 47 : 75)) {
				validacion = true;
			}

		} catch (Exception e) {
		}
		return validacion;
	}
	
	public static boolean isPASPTValido(String numDoc) {
		String paspt = numDoc.replaceAll("[^\\d]", "");

		//O passaporte não aceita menos de 4 numeros ou somente letras
		if (!StringUtils.isBlank(paspt) && paspt.length() < 4) {
			return false;
		} else if (StringUtils.isBlank(paspt) && !StringUtils.isBlank(numDoc)) {
			return false;
		}

		return true;
	}
	
	public static TipoIdentificacionDoc[] buscarComboSegundoTipoDocumentoRemovendoDocumentoSelecionadoTipoIdentificacionDoc(TipoIdentificacionDoc tipoIdentificacionDoc) {
		
		if (tipoIdentificacionDoc == null) {
			return null;
		}
		 
		TipoIdentificacionDoc[] tipoIdentificacionDocs = new TipoIdentificacionDoc[TipoIdentificacionDoc.values().length-1];
		int j = 0;
		for (int i = 0 ; i < TipoIdentificacionDoc.values().length ; i ++) {
			if(tipoIdentificacionDoc.getId().equals(TipoIdentificacionDoc.values()[i].getId())) {
				continue;
			}
			tipoIdentificacionDocs[j] = TipoIdentificacionDoc.values()[i];
			j++;
		}
		 return tipoIdentificacionDocs;
	}
}
