package com.ejie.ab63.service.procedimientos;

import java.util.Map;

import org.apache.commons.lang.StringUtils;
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.inicio.InitForm;
import com.ejie.ab63.model.plantillas.ParametrosConfig;
import com.ejie.ab63.model.terceros.DatosDirecciones;
import com.ejie.ab63.service.AgenciaDataService;
import com.ejie.ab63.service.expedientes.DetailExpedienteService;

/**
 * 
 *  
 *
 */
public class InicioActividadProcedureActions extends BaseProcedureActions {

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

	protected InicioActividadProcedureActions(DetailExpedienteService detailExpedienteService) {
		super(Constantes.PROCEDIMIENTO_INICIO_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 censado
		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 isEnableExecuteAction(InitForm form) {
		DatosDirecciones direcciones = findDireccioneEstablecimiento(form);
		Boolean noTieneDireccionAsociada = direcciones == null || direcciones.getIdDireccion() == null
				|| direcciones.getIdentificadorEstablecimiento() == null;
		return isEmptyIdentificador(form) && isTipoRegistroTemp(form) && noTieneDireccionAsociada;
	}

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

	private Map<String, String> processInicioActividad(InitForm initForm) {

		Map<String, String> data = registroEstablecimiento(initForm, Constantes.TIPO_REGISTRO_DEFINITIVO);

		if (StringUtils.isNotBlank(initForm.getTipoEstablecimiento())
				&& StringUtils.isNotBlank(initForm.getTipoModalidad())
				&& Constantes.AGENCIA_VIAJE.equalsIgnoreCase(initForm.getTipoEstablecimiento())
				&& Constantes.ModalidadFijos.AAVV_PRINCIPAL.equalsIgnoreCase(initForm.getTipoModalidad())) {

			assignNumCieAAVV(initForm, data);
		}
		// 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) {
			Establecimiento establecimiento = this.findEstablecimiento(initForm);
			try {
				this.getDetailExpedienteService().getGenerarPublicacionService()
						.generarPublicacion(establecimiento.getIdEstablecimiento());
			} catch (Exception e) {
				InicioActividadProcedureActions.logger.error("Error en el inicio de actividad del establecimiento "
						+ establecimiento.getIdEstablecimiento());

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

		return data;
	}

	protected void assignNumCieAAVV(InitForm initForm, Map<String, String> data) {
		AgenciaDataService agenciaDataService = this.getDetailExpedienteService().getAgenciaDataService();

		Establecimiento establecimiento = findEstablecimiento(initForm);
		if (null != establecimiento && null != establecimiento.getAgenciaData()
				&& StringUtils.isNotBlank(establecimiento.getAgenciaData().getIdOrigenOfiPrincipal())) {
			if (Constantes.AGENCIA_ORIGEN_OFICINA_PRINCIPAL_CAPV
					.equalsIgnoreCase(establecimiento.getAgenciaData().getIdOrigenOfiPrincipal())) {
				String numCieDefinitivo = agenciaDataService.getNextNumCie();
				if (StringUtils.isNotBlank(numCieDefinitivo)) {
					agenciaDataService.updateNumCieAgenciaData(establecimiento.getAgenciaData(), numCieDefinitivo);
					data.put(Constantes.KEY_NUM_CIE, numCieDefinitivo);
					/*
					 * En el caso de Agencias principales de la CAPV, se debe
					 * mostrar el número de CIE además de la signatura
					 */
					data.put(Constantes.KEY_AJAX_CALLBACK,
							Constantes.KEY_FUNC_SHOW_IDENTIFICADOR_AND_CIE_AAVV_PRINCIPALES);
				}
			} else {
				data.put(Constantes.KEY_AJAX_CALLBACK,
						Constantes.KEY_FUNC_SHOW_IDENTIFICADOR_AAVV_PRINCIPALES_NACIONALES_EXTRANJERAS);
			}
		}
	}

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

	@Override
	public Boolean hasSecondButton(InitForm form) {
		return true;
	}
}