package com.ejie.ab63.service.serviciosWeb;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.exceptions.Ab63Exception;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.service.EstablecimientoDataService;
import com.ejie.ab63.service.EstablecimientoService;
import com.ejie.ab63.service.serviciosWeb.model.DatosEstablecimientoWS;
import com.ejie.ab63.util.InspecionesServiceUtils;

@Service(value = "ServiciosWebService")
@SessionAttributes("usuario")
public class ServiciosWebServiceImpl implements ServiciosWebService {

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

	@Autowired
	private EstablecimientoService establecimientoService;

	@Autowired
	private EstablecimientoDataService establecimientoDataService;

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public String actualizarEstablecimiento(String folderId, DatosEstablecimientoWS datosEstablecimientoWS,
			String usuario) throws Ab63Exception {
		ServiciosWebServiceImpl.logger.info("[AB63 Web Services] ::actualizarEstablecimiento - Inicio");
		ServiciosWebServiceImpl.logger.info("[DEBUG AB63] __datos establecimientos: ", datosEstablecimientoWS);
		if (datosEstablecimientoWS == null) {
			throw new Ab63Exception("error.notData",
					"No se ha enviado el informacion para actualizar el establecimiento",
					"EU_No se ha enviado el informacion para actualizar el establecimiento");
		}
		ServiciosWebServiceImpl.logger
				.info("[AB63 Web Services] ::establecimiento - " + datosEstablecimientoWS.getIdEstablecimiento());
		if (datosEstablecimientoWS.getIdEstablecimiento() == null) {
			throw new Ab63Exception("error.notEstablecimientoID",
					"No se ha enviado el identificador del establecimiento",
					"EU_No se ha enviado el identificador del establecimiento");
		}

		Establecimiento establecimiento = this.establecimientoService
				.find(new Establecimiento(Integer.parseInt(datosEstablecimientoWS.getIdEstablecimiento())));
		if (establecimiento != null && establecimiento.getIdEstablecimiento() != null) {
			// Complete info of establecimiento
			try {
				this.establecimientoDataService.completeEstablecimientoData(establecimiento,
						Constantes.TIPO_REGISTRO_RESUMEN);

				// Apply changes on establecimiento
				InspecionesServiceUtils.actualizarEstablecimiento(datosEstablecimientoWS, establecimiento);

				// Update establecimiento complete
				this.establecimientoService.update(establecimiento, usuario);
				this.establecimientoDataService.updateComplete(establecimiento.getEstablecimientoData(), usuario);
			} catch (Exception e) {
				logger.error("[AB63 Web Services] Error ", e);
				throw new Ab63Exception("error.errorInesperado",
						"Ha ocurrido un error inespereado, por favor intentelo mas tarde",
						"EU_Ha ocurrido un error inespereado, por favor intentelo mas tarde");
			}
		} else {
			throw new Ab63Exception("error.establecimientoNotFound", "No se ha encontrado el establecimiento indicado",
					"EU_No se ha encontrado el establecimiento indicado");
		}
		ServiciosWebServiceImpl.logger.info("[AB63 Web Services] ::actualizarEstablecimiento - Fin");
		return Constantes.AB79_RESPONSE_OK;
	}

}