package com.ejie.ab79.service;

import java.util.Locale;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.dao.ActuacionesJsonDao;
import com.ejie.ab79.dao.DocumentosJsonDao;
import com.ejie.ab79.dao.EnviosJsonDao;
import com.ejie.ab79.dao.InspeccionesJsonDao;
import com.ejie.ab79.dao.PreguntasJsonDao;
import com.ejie.ab79.exceptions.Ab79Exception;
import com.ejie.ab79.model.ActuacionesJson;
import com.ejie.ab79.model.DocumentosJson;
import com.ejie.ab79.model.EnviosJson;
import com.ejie.ab79.model.InspeccionesJson;
import com.ejie.ab79.model.PreguntasJson;
import com.ejie.ab79.model.plantillas.ParametrosConfig;
import com.ejie.ab79.service.plantillas.ParametrosConfigService;

/**
 * TrazabilidadServiceImpl.
 * 
 *  
 */

@Service(value = "trazabilidadService")
public class TrazabilidadServiceImpl implements TrazabilidadService {

	private static final Logger logger = LoggerFactory.getLogger(TrazabilidadServiceImpl.class);

	@Autowired()
	private EnviosJsonDao enviosJsonDao;

	@Autowired()
	private PreguntasJsonDao preguntasJsonDao;

	@Autowired()
	private InspeccionesJsonDao inspeccionesJsonDao;

	@Autowired()
	private DocumentosJsonDao documentosJsonDao;

	@Autowired()
	private ActuacionesJsonDao actuacionesJsonDao;

	@Autowired()
	private ParametrosConfigService parametrosConfigService;

	@Resource()
	ReloadableResourceBundleMessageSource appMessageSource;

	private Boolean activo;

	/**
	 * Resetea el parámetro activo para que compruebe en base de datos el estado
	 * de la trazabilidad. Ejecutarlo al principio de cada método que utilice
	 * este servicio o aplicarlo de manera global a un controlador de la
	 * siguiente manera:
	 * 
	 * @ModelAttribute("resetTrazabilidad")
	 * 
	 * public void resetTrazabilidad() {
	 * 
	 * this.trazabilidadService.resetActivo();
	 * 
	 * }
	 */
	public void resetActivo() {
		this.activo = null;
	}

	/**
	 * Busca en la tabla PARAMETROS_CONFIG el parámetro
	 * Trazabilidad_WebServiceREST que indica si la trazabilidad debería estar
	 * activada o no.
	 * 
	 * @return boolean
	 */
	private boolean isActivo() {
		if (this.activo == null) {
			ParametrosConfig parametrosConfig = new ParametrosConfig();
			parametrosConfig.setDescripcion(Constantes.TRAZABILIDAD_WEBSERVICE);
			parametrosConfig = this.parametrosConfigService.find(parametrosConfig);

			this.activo = parametrosConfig.getValor() == 1;
		}

		return this.activo;
	}

	/**
	 * Inserts a single row in the EnviosJson table.
	 *
	 * @param enviosJson
	 *            EnviosJson
	 * @return EnviosJson
	 * @throws Ab79Exception
	 */
	public EnviosJson addEnviosJson(EnviosJson enviosJson) throws Ab79Exception {
		if (!this.isActivo()) {
			return enviosJson;
		}

		try {
			return this.enviosJsonDao.add(enviosJson);
		} catch (Exception e) {
			String sCodigoError = "error.trazabilidad.enviosJson";

			TrazabilidadServiceImpl.logger.error(sCodigoError, e);

			throw new Ab79Exception(sCodigoError,
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	/**
	 * Inserts a single row in the PreguntasJson table.
	 *
	 * @param preguntasJson
	 *            PreguntasJson
	 * @return PreguntasJson
	 * @throws Ab79Exception
	 */
	public PreguntasJson addPreguntasJson(PreguntasJson preguntasJson) throws Ab79Exception {
		if (!this.isActivo()) {
			return preguntasJson;
		}

		try {
			return this.preguntasJsonDao.add(preguntasJson);
		} catch (Exception e) {
			String sCodigoError = "error.trazabilidad.preguntasJson";

			TrazabilidadServiceImpl.logger.error(sCodigoError, e);

			throw new Ab79Exception(sCodigoError,
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	/**
	 * Inserts a single row in the InspeccionesJson table.
	 *
	 * @param enviosJson
	 *            InspeccionesJson
	 * @return InspeccionesJson
	 * @throws Ab79Exception
	 */
	public InspeccionesJson addInspeccionesJson(InspeccionesJson inspeccionesJson) throws Ab79Exception {
		if (!this.isActivo()) {
			return inspeccionesJson;
		}

		try {
			return this.inspeccionesJsonDao.add(inspeccionesJson);
		} catch (Exception e) {
			String sCodigoError = "error.trazabilidad.inspeccionesJson";

			TrazabilidadServiceImpl.logger.error(sCodigoError, e);

			throw new Ab79Exception(sCodigoError,
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	/**
	 * Inserts a single row in the DocumentosJson table.
	 *
	 * @param documentosJson
	 *            DocumentosJson
	 * @return DocumentosJson
	 * @throws Ab79Exception
	 */
	public DocumentosJson addDocumentosJson(DocumentosJson documentosJson) throws Ab79Exception {
		if (!this.isActivo()) {
			return documentosJson;
		}

		try {
			return this.documentosJsonDao.add(documentosJson);
		} catch (Exception e) {
			String sCodigoError = "error.trazabilidad.documentosJson";

			TrazabilidadServiceImpl.logger.error(sCodigoError, e);

			throw new Ab79Exception(sCodigoError,
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	/**
	 * Inserts a single row in the ActuacionesJson table.
	 *
	 * @param actuacionesJson
	 *            ActuacionesJson
	 * @return ActuacionesJson
	 * @throws Ab79Exception
	 */
	public ActuacionesJson addActuacionesJson(ActuacionesJson actuacionesJson) throws Ab79Exception {
		if (!this.isActivo()) {
			return actuacionesJson;
		}

		try {
			return this.actuacionesJsonDao.add(actuacionesJson);
		} catch (Exception e) {
			String sCodigoError = "error.trazabilidad.actuacionesJson";

			TrazabilidadServiceImpl.logger.error(sCodigoError, e);

			throw new Ab79Exception(sCodigoError,
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					this.appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	/**
	 * Updates the status column of a single row in the EnviosJson table.
	 * 
	 * @param enviosJson
	 *            EnviosJson
	 * @return EnviosJson
	 * @throws Ab79Exception
	 */
	public EnviosJson updateEnviosJson(EnviosJson enviosJson) throws Ab79Exception {
		if (!this.isActivo()) {
			return enviosJson;
		}

		this.enviosJsonDao.updateEnviosJson(enviosJson);

		return enviosJson;
	}
}
