package com.ejie.ad74a.util.constantes;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.context.i18n.LocaleContextHolder;

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

/**
 * enum que contiene todas las tareas que se pueden realizar en los trámites de
 * la app
 * 
 * Formato: nombre_tarea(id de base de datos de situacion, Descripcion)
 *
 */

public enum FinalizacionEstudioEnum {

	REQUERIMIENTO_SUBSANACION("1", "situacioneFinalTarea.requerimientosubsanacion", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.ALTA, ProcedimientosEnum.MODIFICACION, ProcedimientosEnum.INFORME,
					ProcedimientosEnum.REVISION_PRECIO)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO), //

	RESOLUCION_CONCESION("2", "situacioneFinalTarea.resolucionConcesion", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.ALTA, ProcedimientosEnum.REVISION_PRECIO, ProcedimientosEnum.BAJA)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO), //

	RESOLUCION_DENEGACION("3", "situacioneFinalTarea.resolucionDenegacion", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.ALTA, ProcedimientosEnum.REVISION_PRECIO)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO), //

	DESISTIMIENTO("4", "situacioneFinalTarea.desistimiento", //

			new ArrayList<ProcedimientosEnum>(
					Arrays.asList(ProcedimientosEnum.ALTA, ProcedimientosEnum.REVISION_PRECIO, ProcedimientosEnum.BAJA//
					)), //

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_DESISTIMIENTO.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),

	SOLICITAR_INFORME("5", "situacioneFinalTarea.solicitarInforme", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.INFORME)), //
			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),

	NO_SOLICITAR_INFORME("6", "situacioneFinalTarea.noSolicitarInforme", //
			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.INFORME)), //
			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),

	TRAMITE_DE_AUDIENCIA("7", "situacioneFinalTarea.tramiteDeAudiencia", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.BAJA)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_DE_OFICIO), //

	NO_HACER_NADA("8", "situacioneFinalTarea.noHacerNada", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.ALTA, ProcedimientosEnum.MODIFICACION, ProcedimientosEnum.INFORME,
					ProcedimientosEnum.REVISION_PRECIO, ProcedimientosEnum.BAJA)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_AUDIENCIA.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),

	CAMBIO_ACEPTADO("9", "situacioneFinalTarea.cambioAceptado", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.MODIFICACION)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),

	CAMBIO_NO_ACEPTADO("10", "situacioneFinalTarea.cambioNoAceptado", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.MODIFICACION)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_APORTACION_SUBSANACION.getId(),
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),
	RESOLUCION_DENEGACION_ALEGACIONES("11", "situacioneFinalTarea.denegacionServicio", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.BAJA)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_AUDIENCIA.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO),
	MANTENER_SERVICIO("12", "situacioneFinalTarea.mantenerServicio", //

			new ArrayList<ProcedimientosEnum>(Arrays.asList(//
					ProcedimientosEnum.BAJA)),

			new ArrayList<Long>(Arrays.asList(//
					TipoTramiteExpediente.tipoEstudioDoc10.ESTUDIO_DOCUMENTACION_AUDIENCIA.getId())),
			Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO);//

	private FinalizacionEstudioEnum(String id, String labelDesc, ArrayList<ProcedimientosEnum> procedimientosEnum,
			ArrayList<Long> tipoEstudioDoc, Integer deOficio) {
		this.id = id;
		this.labelDesc = labelDesc;
		this.enProcedimientosActivo = procedimientosEnum;
		this.tipoEstudioDoc = tipoEstudioDoc;
		this.deOficio = deOficio;
	}

	private String id;
	private String labelDesc;
	private ArrayList<ProcedimientosEnum> enProcedimientosActivo;
	private ArrayList<Long> tipoEstudioDoc;
	private Integer deOficio; // Algunos finales sólo están disponibles en los expedientes de oficio

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

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

	public String getLabelDesc(String id) {
		String desc = "";
		for (FinalizacionEstudioEnum fin : FinalizacionEstudioEnum.values()) {
			if (fin.getId().equalsIgnoreCase(id)) {
				desc = Utilidades.getLabelFromResource(Constantes.BASENAME_RESOURCE_AD74A_I18N, fin.getLabelDesc(),
						LocaleContextHolder.getLocale());
			}
		}
		return desc;
	}

	public List<ProcedimientosEnum> getEnProcedimientosActivo() {
		return enProcedimientosActivo;
	}

	public static FinalizacionEstudioEnum[] valuesByProcedimiento(String idProcedimiento00, Long tipoEstudioDoc,
			Integer deOficio) {

		ProcedimientosEnum procedimientoEnum = ProcedimientosEnum.getById(idProcedimiento00);

		ArrayList<FinalizacionEstudioEnum> situacioneFinalTareaList = new ArrayList<FinalizacionEstudioEnum>();

		if (procedimientoEnum != null) {
			for (FinalizacionEstudioEnum situacioneFinal : FinalizacionEstudioEnum.values()) {
				if (situacioneFinal.getTipoEstudioDoc().contains(tipoEstudioDoc)
						&& situacioneFinal.getEnProcedimientosActivo().contains(procedimientoEnum)) {

					// Si se pasa el parametro deOficio, en caso de que no sea de oficio no se
					// pasaran los finales de oficio
					if (null != deOficio) {
						if (Constantes.TipoSolicitud.SOLICITUD_DE_OFICIO.equals(deOficio)
								|| (Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO.equals(deOficio) && situacioneFinal
										.getDeOficio().equals(Constantes.TipoSolicitud.SOLICITUD_NO_OFICIO))) {
							situacioneFinalTareaList.add(situacioneFinal);
						}
					} else {
						situacioneFinalTareaList.add(situacioneFinal);
					}

				}
			}
		}
		FinalizacionEstudioEnum[] situacioneFinalTareaArray = new FinalizacionEstudioEnum[situacioneFinalTareaList
				.size()];
		situacioneFinalTareaList.toArray(situacioneFinalTareaArray);
		return situacioneFinalTareaArray;
	}

	public Combo getCombo() {
		return new Combo(id,
				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 List<Long> getTipoEstudioDoc() {
		return tipoEstudioDoc;
	}

	public Integer getDeOficio() {
		return deOficio;
	}

}
