package com.ejie.ad74a.util.constantes;

import org.springframework.context.i18n.LocaleContextHolder;

import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.util.comun.Utilidades;

/**
 * Tipos de entrada
 */

public enum TipoAportacionEnum {

	// el primer campo hace referencia al campo SUBMISIONTYPE_01
	// El segundo campo se usa para las N intancias y alberga el instanceID

	SOLICITUD("1", null, "tipoAportacion.solicitud", TipoProcesoEnum.SOLICITUD_ALTA, TipoProcesoEnum.SOLICITUD_BAJA,
			TipoProcesoEnum.SOLICITUD_MODIFICACION, TipoProcesoEnum.SOLICITUD_INF_INTERVENCION), //
	SOLICITUD_CIUDADANO_PRESENCIAL("r02d1869618978B004C6E5823C4C682F2C2B681A2E3F", null,
			"tipoAportacion.solicitud.ciudanoPresencial", TipoProcesoEnum.SOLICITUD_ALTA,
			TipoProcesoEnum.SOLICITUD_BAJA, TipoProcesoEnum.SOLICITUD_MODIFICACION,
			TipoProcesoEnum.SOLICITUD_INF_INTERVENCION), //
	APORTACION_DOCUMENTOS("2", null, "tipoAportacion.aportDocumentos", TipoProcesoEnum.APORTACION,
			TipoProcesoEnum.SUBSANACION_DOCUMENTOS), //
	APORTACION_DOCUMENTOS_CIUDADANO_PRESENCIAL("r02dFE0673A510281D750C9F9758A73EE2A8DD217E5C", null,
			"tipoAportacion.aportDocumentos.ciudanoPresencial", TipoProcesoEnum.APORTACION,
			TipoProcesoEnum.SUBSANACION_DOCUMENTOS), //
	SUBSANACION("4", null, "tipoAportacion.subsanacion", TipoProcesoEnum.SUBSANACION_DOCUMENTOS), //
	DESISTIMIENTO("6", null, "tipoAportacion.desistimiento", TipoProcesoEnum.DESISTIMIENTO), //
	RECURSO_DESISTIMIENTO("5", null, "tipoAportacion.recursoDesistimiento", TipoProcesoEnum.RECURSO_DESISTIMIENTO);

	private final String tipo;
	private final Long instanceId;
	private final String labelDesc;
	private final TipoProcesoEnum[] tipoProceso;

	private TipoAportacionEnum(String tipo, Long instanceId, String labelDesc, TipoProcesoEnum... tipoProceso) {
		this.tipo = tipo;
		this.instanceId = instanceId;
		this.labelDesc = labelDesc;
		this.tipoProceso = tipoProceso;
	}

	public String getTipo() {
		return this.tipo;
	}

	public String getTipoLeadingZero() {
		if (this.tipo.length() > 2) {
			return this.tipo;
		} else {
			return ("00" + this.tipo).substring(this.tipo.length());
		}
	}

	public Long getInstanceId() {
		return this.instanceId;
	}

	public String getLabelDesc() {
		return Utilidades.getLabelFromResource(Constantes.BASENAME_RESOURCE_AD74A_I18N, this.labelDesc,
				LocaleContextHolder.getLocale());
	}

	public TipoProcesoEnum[] getTipoProceso() {
		return this.tipoProceso;
	}

	public static String getDesc(String tipo, Long instanceId) {
		for (TipoAportacionEnum tipoEntrada : TipoAportacionEnum.values()) {

			if (null != instanceId) {
				if (tipoEntrada.getTipo().equals(tipo) && tipoEntrada.getInstanceId().compareTo(instanceId) == 0) {
					return tipoEntrada.getLabelDesc();
				}
			} else {
				if (tipoEntrada.getTipo().equals(tipo)) {
					return tipoEntrada.getLabelDesc();
				}
			}
		}
		return null;
	}

	public static TipoProcesoEnum[] getTipoProceso(String tipo, Long instanceId) {
		for (TipoAportacionEnum tipoEntrada : TipoAportacionEnum.values()) {
			if (null != instanceId) {
				if (tipoEntrada.getTipo().equals(tipo) && tipoEntrada.getInstanceId().compareTo(instanceId) == 0) {
					return tipoEntrada.getTipoProceso();
				}
			} else {
				if (tipoEntrada.getTipo().equals(tipo)) {
					return tipoEntrada.getTipoProceso();
				}
			}

		}
		return null;
	}

	public Combo getCombo() {
		return new Combo(tipo.toString(),
				Utilidades.getLabelFromResource(Constantes.BASENAME_RESOURCE_AD74A_I18N, this.labelDesc,
						com.ejie.ad74a.constantes.Constantes.LOCALE_ES),
				Utilidades.getLabelFromResource(Constantes.BASENAME_RESOURCE_AD74A_I18N, this.labelDesc,
						com.ejie.ad74a.constantes.Constantes.LOCALE_EU));
	}

	public static String getIdAporByIdLibroReg(String idLibroReg) {
		for (TipoAportacionEnum apor : TipoAportacionEnum.values()) {
			if (apor.getTipoLeadingZero().equalsIgnoreCase(idLibroReg)) {
				return apor.getTipoLeadingZero();
			}
		}
		return "";
	}

}
