package com.ejie.ab63.service.procedimientos;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

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.plantillas.ParametrosConfig;
import com.ejie.ab63.model.terceros.DatosDirecciones;
import com.ejie.ab63.service.EstablecimientoService;
import com.ejie.ab63.service.expedientes.DetailExpedienteService;

/**
 * 
 *  
 *
 */
public class CeseActividadProcedureActions extends BaseProcedureActions {

	private static final Log logger = LogFactory.getLog(CeseActividadProcedureActions.class);

	protected CeseActividadProcedureActions(DetailExpedienteService detailExpedienteService) {
		super(Constantes.PROCEDIMIENTO_CESE_ACTIVIDAD, detailExpedienteService);
	}

	@Override
	public Establecimiento findEstablecimiento(InitForm form) {
		Establecimiento establecimiento = null;
		// Si el expediente no es de oficio estara asociado el expediente por la
		// direccion
		DatosDirecciones datosDirecciones = findDireccioneEstablecimiento(form);
		if (!form.isExpedienteOficio()) {
			// recuperar el establecimiento buscando por el idExpediente
			establecimiento = this.getDetailExpedienteService().getEstablecimientoService()
					.findByIdenticadorEstablecimiento(datosDirecciones.getIdentificadorEstablecimiento());
		} else {
			// Si no ha una direccion asociada al expediente se crea, es
			// necesario para el correcto procesamiento.
			if (datosDirecciones == null || datosDirecciones.getIdDireccion() == null) {
				// DatosDirecciones direcciones = new DatosDirecciones();
				// DatosTerceros datosTerceros = new
				// DatosTerceros(form.getIdTerceroTitular());
				// direcciones.setDatosTerceros(datosTerceros);
				// direcciones.setTiposDireccion(new
				// TiposDireccion(Constantes.ID_UBICACION_INVERSION));
				// this.getDetailExpedienteService().getDatosDireccionesService().add(direcciones);
				establecimiento = new Establecimiento();
			} else {
				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 && isEnableExecuteAction(initForm);
	}

	@Override
	public Boolean isEnableExecuteAction(InitForm form) {
		if (form.isExpedienteOficio()) {
			DatosDirecciones direcciones = findDireccioneEstablecimiento(form);
			if (form.isIdentificadorEmpty() && direcciones.getIdentificadorEstablecimiento() == null) {
				return true;
			}

			Establecimiento establecimiento = this.getDetailExpedienteService().getEstablecimientoService()
					.findByIdenticadorEstablecimiento(form.getIdentificadorEstablecimiento());
			return establecimiento.getIdEstablecimiento() != null && establecimiento.getFechaBaja() == null;

		} else {
			Establecimiento establecimiento = this.getDetailExpedienteService().getEstablecimientoService()
					.findByIdenticadorEstablecimiento(form.getIdentificadorEstablecimiento());
			return establecimiento.getIdEstablecimiento() != null && establecimiento.getFechaBaja() == null;
		}
	}

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

	private Map<String, String> proccesBajaEstablecimento(InitForm form) {
		HashMap<String, String> data = new HashMap<String, String>(1);
		EstablecimientoService establecimientoService = this.getDetailExpedienteService().getEstablecimientoService();
		Establecimiento establecimiento = establecimientoService
				.findByIdenticadorEstablecimiento(form.getIdentificadorEstablecimiento());
		if (establecimiento == null || establecimiento.getIdEstablecimiento() == null) {
			data.put(Constantes.KEY_AJAX_ERROR, "identificadorError");
			return data;
		}
		establecimientoService.relacionarExpedienteOficio(form);
		establecimientoService.establecerFechaBaja(form.getIdentificadorEstablecimiento(), form.getIdExpediente(),
				form.isExpedienteOficio());

		// publicamos el nuevo alta en AA80T
		ParametrosConfig parametrosConfigFind = new ParametrosConfig();
		parametrosConfigFind.setDescripcion(Constantes.ACTIVADA_PUBLICACION_AA80T);
		ParametrosConfig parametrosConfig = this.getDetailExpedienteService().getParametrosConfigService()
				.find(parametrosConfigFind);

		if (parametrosConfig.getValor() == 1) {
			try {
				this.getDetailExpedienteService().getGenerarPublicacionService()
						.generarPublicacion(establecimiento.getIdEstablecimiento());
			} catch (Exception e) {
				CeseActividadProcedureActions.logger.error("Error en el proceso de modificacion del establecimiento "
						+ establecimiento.getIdEstablecimiento());

				data.put(Constantes.KEY_AJAX_ERROR, "errorGenerico");
				return data;
			}
		}

		data.put(Constantes.KEY_AJAX_CALLBACK, "updateButtonsCeseSuccess");
		data.put(Constantes.KEY_ID_ORIGEN, "" + form.getIdExpedienteOrigen());
		return data;
	}

	@Override
	public String getButtonsText(InitForm form) {
		return form.getProcedureCod();
	}

}
