package com.ejie.ab63.service.procedimientos;

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

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.service.expedientes.DetailExpedienteService;

/**
 * 
 *  
 *
 */
public class ProcedureActionFacade {

	private static ProcedureActionFacade instance;

	private Map<String, ProcedureActions> proceduresActions = new HashMap<String, ProcedureActions>(6);

	private ProcedureActionFacade() {
	}

	public static ProcedureActionFacade getInstance() {
		if (instance == null) {
			instance = new ProcedureActionFacade();
		}
		return instance;
	}

	/**
	 * Obtiene el objeto responsable de las acciones sobre el expediente de la
	 * ficha para cada procedimiento
	 * 
	 * @param codProcedure
	 * @param expedienteService
	 * @return
	 */
	public ProcedureActions getProcedureAction(String codProcedure, DetailExpedienteService expedienteService) {
		if (proceduresActions.isEmpty()) {
			initProceduresActions(expedienteService);
		}
		return proceduresActions.get(codProcedure);
	}

	/**
	 * Carga en memoria los Procedure Action para los procedimiento
	 * 
	 * @param expedienteService
	 */
	private void initProceduresActions(DetailExpedienteService expedienteService) {
		proceduresActions.put(Constantes.PROCEDIMIENTO_INICIO_ACTIVIDAD,
				new InicioActividadProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_MODIFICACIONES_ACTIVIDAD,
				new ModificacionActividadProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_CESE_ACTIVIDAD,
				new CeseActividadProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_DISPENSAS_ACTIVIDAD,
				new DispensaActividadProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_CONSULTAS_ACTIVIDAD,
				new ConsultaPreviaProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_ADAPTACION_DECRETO_ACTIVIDAD,
				new AdaptacionDecretoProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_COMPROBACION_DE_OFICIO,
				new ComprobacionInicioActividadProcedureActions(expedienteService));
		proceduresActions.put(Constantes.PROCEDIMIENTO_DESCONOCIDO, new DefaultProcedureActions(expedienteService));
	}

	public ProcedureActions getDefault() {
		return proceduresActions.get(Constantes.PROCEDIMIENTO_DESCONOCIDO);
	}
}
