package com.ejie.ad74a.util.constantes;

import java.util.Arrays;

import org.springframework.context.i18n.LocaleContextHolder;

import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.x38.json.JSONArray;

public enum TipoProcesoEnum {

	// Enum relacionado directamente con TipoAportacionEnum. Aquí se configura las
	// diferentes formas de procesar una aportacion
	// Ejemplo complejo: El RECURSO_ALZADA que tiene codigo 5 en TipoAportacionEnum
	// se puede procesar como: RECURSO_RESOLUCION - RECURSO_DESESTIMINETO -
	// RECURSO_RENUNCIA - RECURSO_REINTEGRO
	// El primer campo es el codigo del TipoAportacionEnum+secuencial
	// segundo campo: descripcion
	// tercer campo: codigo del TipoAportacionEnum de como se procesa
	// cuarto campo: indica que QRs del libro de registro se corresponden con cada
	// proceso

	SOLICITUD_ALTA("11", "tipoProceso.solicitudAlta", "1", ProcedimientosEnum.ALTA, "00870#02#01"), //
	SOLICITUD_BAJA("12", "tipoProceso.solicitudBaja", "1", ProcedimientosEnum.BAJA, "00870#03#01"),
	SOLICITUD_MODIFICACION("13", "tipoProceso.solicitudModificacion", "1", ProcedimientosEnum.MODIFICACION,
			"00870#04#01"),
	SOLICITUD_REVISION("15", "tipoProceso.solicitudRevision", "1", ProcedimientosEnum.REVISION_PRECIO, "00870#05#01"), //
	SOLICITUD_INF_INTERVENCION("14", "tipoProceso.solicitudInfIntervencion", "1", ProcedimientosEnum.INFORME,
			"00870#06#01"),
	SOLICITUD_NOTIFICACION_LIQUIDACION("16", "tipoProceso.solicitudNotificacionLiquidacion", "1",
			ProcedimientosEnum.NOTIFICACION_LIQUIDACION, "00870#07#04"),
	APORTACION("21", "tipoProceso.aportacion", "2", null, "00870#02#02", "00870#03#02", "00870#04#02", "00870#05#02",
			"00870#06#02"), //
	SUBSANACION_DOCUMENTOS("41", "tipoProceso.subsanacionDoc", "4", null, "00870#02#04", "00870#03#04", "00870#04#04",
			"00870#05#04", "00870#06#04"), //
	DESISTIMIENTO("61", "tipoProceso.desistimiento", "6", null, "00870#02#06", "00870#03#06", "00870#04#06",
			"00870#05#06", "00870#06#06"), //
	RECURSO_DESISTIMIENTO("52", "tipoProceso.recursoResolDesisExpDesis", "5", null, "00870#02#30", "00870#03#30",
			"00870#04#30", "00870#05#30", "00870#06#30"); //
	// RENUNCIA("71", "tipoProceso.renuncia", "7");

	private final String tipo;
	private final String labelDesc;
	private final String nuevoTipoAportacion;
	private final String[] tiposQR;
	private final ProcedimientosEnum procedimiento;

	private TipoProcesoEnum(String tipo, String labelDesc, String nuevoTipoAportacion, ProcedimientosEnum procedimiento,
			String... tiposQR) {
		this.tipo = tipo;
		this.labelDesc = labelDesc;
		this.nuevoTipoAportacion = nuevoTipoAportacion;
		this.procedimiento = procedimiento;
		this.tiposQR = tiposQR;
	}

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

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

	public static String getNuevoTipoByTipo(String tipo) {
		for (TipoProcesoEnum tiposProceso : TipoProcesoEnum.values()) {
			if (tiposProceso.getTipo().equalsIgnoreCase(tipo)) {
				return tiposProceso.getNuevoTipoAportacion();
			}
		}
		return null;
	}

	public String[] getTiposQR() {
		return this.tiposQR;
	}

	public ProcedimientosEnum getProcedimiento() {
		return this.procedimiento;
	}

	public static String getTipoByQR(String qr) {
		for (TipoProcesoEnum tiposProceso : TipoProcesoEnum.values()) {
			if (Arrays.asList(tiposProceso.getTiposQR()).contains(qr)) {
				return tiposProceso.tipo;
			}
		}
		return TipoProcesoEnum.SOLICITUD_ALTA.tipo;
	}

	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 JSONArray getTiposSolicitud() {

		JSONArray solicitudes = new JSONArray();

		solicitudes.put(SOLICITUD_ALTA.getTipo());
		solicitudes.put(SOLICITUD_BAJA.getTipo());
		solicitudes.put(SOLICITUD_MODIFICACION.getTipo());
		solicitudes.put(SOLICITUD_REVISION.getTipo());
		solicitudes.put(SOLICITUD_INF_INTERVENCION.getTipo());
		solicitudes.put(SOLICITUD_NOTIFICACION_LIQUIDACION.getTipo());

		return solicitudes;

	}

	public String getNuevoTipoAportacion() {
		return nuevoTipoAportacion;
	}

}