package com.ejie.ab79.service.inspecciones;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;

import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.comun.UtilUsuario;
import com.ejie.ab79.comun.UtilsConfig;
import com.ejie.ab79.model.RelEstIns;
import com.ejie.ab79.model.expedientes.DatosDirecciones;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.inspecciones.CampainasInspeccion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.plantillas.ParametrosConfig;
import com.ejie.ab79.model.propuestaSancion.PropuestaSancion;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.expedientes.DatosDireccionesService;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.plantillas.ParametrosConfigService;
import com.ejie.ab79.service.procedimientos.ProcedimientosService;
import com.ejie.ab79.service.propuestaSancion.PropuestaSancionService;

/**
 * InspeccionesServiceImpl  
 * 
 *  
 */

@Service(value = "fichaDeInspeccionService")
public class fichaDeInspeccionServiceImpl implements fichaDeInspeccionService {

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

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private CampainasInspeccionService campainasInspeccionService;

	@Autowired
	private RelEstInsService relEstInsService;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	@Autowired
	private PropuestaSancionService propuestaSancionService;

	@Autowired
	private ProcedimientosService procedimientosService;

	@Autowired
	private DatosDireccionesService datosDireccionesService;

	@Override
	public String fichaInspeccionView(HttpServletRequest httpRequest, Inspecciones inspecciones, Model model) {

		// Obtenemos los datos del Usuario logeado
		Authentication aut = SecurityContextHolder.getContext().getAuthentication();

		fichaDeInspeccionServiceImpl.logger.info("Autotenticación : getAuthentication: " + aut);

		Usuario usuario = UtilUsuario.getUsuario(aut, httpRequest);

		model.addAttribute("usuario", usuario);

		if (inspecciones != null) {
			Expedientes expedientes = new Expedientes();
			Integer idInspeccion = inspecciones.getIdInspeccion();
			ParametrosConfig parametrosConfigPropuestaSancion = new ParametrosConfig();
			parametrosConfigPropuestaSancion.setDescripcion(Constantes.CONFIGURACION_PROPUESTA_SANCION);
			parametrosConfigPropuestaSancion = this.parametrosConfigService.find(parametrosConfigPropuestaSancion);

			if (parametrosConfigPropuestaSancion != null) {
				model.addAttribute("parametroPropuestaSancion", parametrosConfigPropuestaSancion.getValor());
			}

			ParametrosConfig parametrosConfigMovilidad = new ParametrosConfig();
			parametrosConfigMovilidad.setDescripcion(Constantes.CONFIGURACION_MOVILIDAD);
			parametrosConfigMovilidad = this.parametrosConfigService.find(parametrosConfigMovilidad);

			if (parametrosConfigMovilidad != null) {
				model.addAttribute("parametroMovilidad", parametrosConfigMovilidad.getValor());
			}

			model.addAttribute("reusltadoInspeccion", inspecciones.getResultadoInspeccion().getIdResultadoInspeccion());
			model.addAttribute("estadoInspeccion", inspecciones.getEstadoInspeccion().getIdEstadoInspeccion());
			model.addAttribute("origenInspeccion", inspecciones.getIdOrigenInspeccion());
			model.addAttribute("direccionFicha", inspecciones.getDireccion().getIdDireccion());
			model.addAttribute("urlAB59", UtilsConfig.getAppProperties().getProperty("URLAB59"));
			model.addAttribute("fechaFinInspeccionHeader", inspecciones.getFechaFinInspeccion());
			expedientes.setInspeccion(inspecciones);

			PropuestaSancion propuestaSancion = new PropuestaSancion();
			propuestaSancion.setIdInspeccion(inspecciones.getIdInspeccion());
			List<PropuestaSancion> listaPropuestas = this.propuestaSancionService.findAll(propuestaSancion);
			propuestaSancion = (listaPropuestas != null && !listaPropuestas.isEmpty() ? listaPropuestas.get(0) : null);
			model.addAttribute("propuestaSancion", propuestaSancion);

			Expedientes expedientesAux = this.expedientesService.findByIdExpediente(expedientes);

			boolean direccionExpedienteConIdentificadorEstablecimiento = this
					.ObtenerDireccionConIdentificadorEstablecimiento(expedientesAux, inspecciones);
			model.addAttribute("direccionExpedienteConIdentificadorEstablecimiento",
					direccionExpedienteConIdentificadorEstablecimiento);

			if (null != expedientesAux && null != expedientesAux.getIdExpediente()) {
				String url = UtilsConfig.getAppProperties().getProperty("urlVerDocumento");
				url = url.replace("[folderID]", expedientesAux.getFolderId());
				model.addAttribute("urlVerDocumentos", url);
				model.addAttribute("idExpediente", expedientesAux.getIdExpediente());
				model.addAttribute("relacionExpediente", expedientesAux.getRelacionExpediente());
				model.addAttribute("idExpedienteOrigen", expedientesAux.getIdExpedienteOrigen());
				model.addAttribute("idProcedimiento", expedientesAux.getIdProcedimiento());
				model.addAttribute("folderId", expedientesAux.getFolderId());
				model.addAttribute("folderNumber", expedientesAux.getFolderNumber());
				model.addAttribute("procedureId", expedientesAux.getProcedimientos().getCodProcedureId());

				if (inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_CAMPAINA
						|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_INSPECCION_OFICIO) {
					boolean esProcedimientoInicioOficio = this.procedimientosService
							.esProcedimientoInicioOficio(expedientesAux.getProcedimientos().getIdProcedimiento());
					model.addAttribute("esProcedimientoInicioOficio", esProcedimientoInicioOficio);
				}

				boolean esExpedienteCerrado = this.expedientesService.findExpedienteCerrado(expedientesAux);
				model.addAttribute("esExpedienteCerrado", esExpedienteCerrado);

				if (0 != expedientesAux.getIdExpedienteOrigen()) {
					Expedientes expedientesOrigen = new Expedientes();
					expedientesOrigen.setIdExpediente(expedientesAux.getIdExpedienteOrigen());
					Expedientes expedientesOrigenAux = this.expedientesService
							.findByIdExpedienteOrigen(expedientesOrigen);
					expedientesAux.setExpedienteOrigen(expedientesOrigenAux);

					String urlOrigen = UtilsConfig.getAppProperties().getProperty("urlVerDocumento");
					urlOrigen = urlOrigen.replace("[folderID]", expedientesAux.getExpedienteOrigen().getFolderId());
					model.addAttribute("urlVerDocumentosOrigen", urlOrigen);
				}

				model.addAttribute("idInspeccion", idInspeccion);
				model.addAttribute("urlVerExpediente", false);

				return "fichaDeInspeccion";
			} else if (inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_CAMPAINA) {
				CampainasInspeccion campaina = this.campainasInspeccionService.find(inspecciones.getCampaina());
				if (campaina != null) {
					model.addAttribute("idProcedimiento", campaina.getProcedimiento().getIdProcedimiento());
					model.addAttribute("procedureId", campaina.getProcedimiento().getCodProcedureId());
				}
				model.addAttribute("idInspeccion", idInspeccion);
				model.addAttribute("urlVerExpediente", false);

				return "fichaDeInspeccion";

			} else if (inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_INSPECCION_OFICIO
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_BUZON_FRAUDE
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_DENUNCIAS) {

				RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspecciones);
				if (relEstIns != null) {

					if (relEstIns.getProcedimiento() != null) {
						model.addAttribute("idProcedimiento", relEstIns.getProcedimiento().getIdProcedimiento());
						model.addAttribute("procedureId", relEstIns.getProcedimiento().getCodProcedureId());
					}

				}

				model.addAttribute("idInspeccion", idInspeccion);
				model.addAttribute("urlVerExpediente", false);

				return "fichaDeInspeccion";
			} else {
				return "folderError";
			}
		} else {
			return "folderError";
		}
	}

	private boolean ObtenerDireccionConIdentificadorEstablecimiento(Expedientes expedientes,
			Inspecciones inspecciones) {

		boolean direccionExpedienteConIdentificadorEstablecimiento = false;

		if (null != expedientes && null != expedientes.getIdExpediente()) {
			DatosDirecciones datosDireccionesExpediente = this.datosDireccionesService
					.findDomicilioUbicacion(expedientes.getIdExpediente(), Constantes.ID_UBICACION_INVERSION);
			direccionExpedienteConIdentificadorEstablecimiento = (datosDireccionesExpediente != null
					&& datosDireccionesExpediente.getIdentificadorEstablecimiento() != null
					&& !datosDireccionesExpediente.getIdentificadorEstablecimiento().equals("") ? true : false);
		} else {

			Integer idInspeccion = inspecciones.getIdInspeccion();
			DatosDirecciones ubicacionInversion = this.datosDireccionesService
					.findDomicilioUbicacionSinExpediente(idInspeccion, Constantes.ID_UBICACION_INVERSION);

			if (ubicacionInversion != null) {
				if (ubicacionInversion.getIdentificadorEstablecimiento() != null
						|| ubicacionInversion.getIdentificadorEstablecimiento() != "") {
					direccionExpedienteConIdentificadorEstablecimiento = true;
				} else {
					direccionExpedienteConIdentificadorEstablecimiento = false;
				}
			} else {
				direccionExpedienteConIdentificadorEstablecimiento = false;
			}

		}
		return direccionExpedienteConIdentificadorEstablecimiento;
	}

}
