package com.ejie.ab63.service.procedimientos;

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

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.expedientes.Expedientes;
import com.ejie.ab63.model.inicio.InitForm;
import com.ejie.ab63.model.terceros.DatosDirecciones;
import com.ejie.ab63.service.EstablecimientoService;
import com.ejie.ab63.service.expedientes.DetailExpedienteService;

/**
 * 
 *  
 *
 */
public class DispensaActividadProcedureActions extends BaseProcedureActions {

	protected DispensaActividadProcedureActions(DetailExpedienteService detailExpedienteService) {
		super(Constantes.PROCEDIMIENTO_DISPENSAS_ACTIVIDAD, detailExpedienteService);
	}

	@Override
	public Establecimiento findEstablecimiento(InitForm form) {
		// recuperar el establecimiento buscando por el idExpediente
		Establecimiento establecimiento = this.getDetailExpedienteService().getEstablecimientoService()
				.findEstablecimientoByIdExpediente(form.getIdExpediente());

		// Si no se encuentra por id expediente, ya ha sido procesado
		if (establecimiento == null || establecimiento.getIdEstablecimiento() == null) {
			DatosDirecciones datosDirecciones = findDireccioneEstablecimiento(form);
			establecimiento = this.getDetailExpedienteService().getEstablecimientoService()
					.findByIdenticadorEstablecimiento(datosDirecciones.getIdentificadorEstablecimiento());
		}
		return establecimiento;
	}

	@Override
	public DatosDirecciones findDireccioneEstablecimiento(InitForm form) {
		return this.getDetailExpedienteService().getDatosDireccionesService()
				.findEstablecimientoExpediente(form.getIdExpediente());
	}

	@Override
	public Boolean isEnableSaveExpediente(InitForm initForm) {
		Boolean result = true;
		Expedientes expediente = new Expedientes();
		expediente.setIdExpediente(initForm.getIdExpediente());
		expediente = this.getDetailExpedienteService().getExpedientesService().find(expediente);

		if (expediente == null) {
			result = false;
		}
		// Si el expediente ya esta cerrado no se puede guardar
		if (result && this.getDetailExpedienteService().getExpedientesService().checkIsClosed(expediente)) {
			result = false;
		}
		if (result && initForm.getProcedureId() == null) {
			result = false;
		}
		if (result && (initForm.getIdTerceroTitular() == null || initForm.getIdTerceroTitular() == 0)) {
			result = false;
		}
		return result;

	}

	@Override
	public Boolean isEnableExecuteAction(InitForm form) {
		return isEnableSaveExpediente(form);
	}

	@Override
	public Map<String, String> executeAction(InitForm form) {
		return processDispensa(form);
	}

	protected Map<String, String> processDispensa(InitForm initForm) {
		Map<String, String> data = new HashMap<String, String>();
		EstablecimientoService establecimientoService = this.getDetailExpedienteService().getEstablecimientoService();

		if (establecimientoService.existsDispensaForExp(initForm.getFolderId())) {
			establecimientoService.updateDispensa(initForm, data);
		} else {
			if (initForm.isIdentificadorEmpty()) {
				data = registroEstablecimientoProvisional(initForm);
			} else {
				data = asociarEstablecimientoTemporal(initForm);
			}
			establecimientoService.createDispensa(initForm, data);
		}

		return data;
	}

	@Override
	public String getButtonsText(InitForm form) {
		StringBuilder buffer = new StringBuilder();
		if (!form.isIdentificadorEmpty()) {
			buffer.append("R");
		}
		buffer.append(form.getProcedureCod());
		return buffer.toString();
	}

}
