package com.ejie.ab79.control.fichaInspeccion;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.Inspectores;
import com.ejie.ab79.model.RelEstIns;
import com.ejie.ab79.model.actuaciones.Actuaciones;
import com.ejie.ab79.model.expedientes.DatosDirecciones;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.inspecciones.Agrupaciones;
import com.ejie.ab79.model.inspecciones.CampainasInspeccion;
import com.ejie.ab79.model.inspecciones.EstadosInspeccion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.inspecciones.RelExpIns;
import com.ejie.ab79.model.inspecciones.ResultadosInspeccion;
import com.ejie.ab79.model.protocolos.Protocolos;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.actuaciones.ActuacionesService;
import com.ejie.ab79.service.expedientes.DatosDireccionesService;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.inspecciones.EstadosInspeccionService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.ab79.service.inspecciones.RelExpInsService;
import com.ejie.ab79.service.preguntasRespuestas.RespuestasProtocoloService;
import com.ejie.ab79.service.protocolos.ProtocolosService;
import com.ejie.ab79.webservice.adaptadores.ab61WebServiceAdaptador;

/**
 * CampainasInspeccionController  
 * 
 *  
 */
@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/datosbasicosdeinspeccion")

public class DatosBasicosDeInspeccionController {

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

	@Autowired
	private InspeccionesService inspeccionesService;
	@Autowired
	private ProtocolosService protocolosService;
	@Autowired
	private RespuestasProtocoloService respuestasProtocoloService;
	@Autowired
	private ActuacionesService actuacionesService;
	@Autowired
	private RelExpInsService relExpInsService;
	@Autowired
	private RelEstInsService relEstInsService;
	@Autowired
	private EstadosInspeccionService estadosInspeccionService;
	@Autowired
	private ExpedientesService expedientesService;
	@Autowired
	private DatosDireccionesService datosDireccionesService;
	@Autowired
	private ab61WebServiceAdaptador ab61WebServiceAdaptadorService;

	/**
	 * Metodo de presentacion de las Tabs.
	 * 
	 * @param model
	 *            Model
	 * @return String
	 */
	@RequestMapping(value = "/maint/{idInspeccion}", method = RequestMethod.GET)
	public String getFormEdit(@PathVariable("idInspeccion") Integer idInspeccion, Model model,
			@ModelAttribute(value = "usuario") Usuario usuario) {
		DatosBasicosDeInspeccionController.logger.info("[GET - View] : Tabs de datos basicos de inspeccion");

		Inspecciones inspeccion = new Inspecciones();
		Protocolos protocolo = new Protocolos();

		inspeccion.setIdInspeccion(idInspeccion);
		inspeccion = this.inspeccionesService.find(inspeccion);

		if (inspeccion.getIdProtocolo() != null && inspeccion.getIdProtocolo().getIdProtocolo() != null) {
			protocolo.setIdProtocolo(inspeccion.getIdProtocolo().getIdProtocolo());
			protocolo = this.protocolosService.find(protocolo);
			inspeccion.setIdProtocolo(protocolo);
		}

		EstadosInspeccion estadoInspeccion = this.estadosInspeccionService.findByOrigenDireccion(
				inspeccion.getIdOrigenInspeccion(), inspeccion.getDireccion().getIdDireccion(),
				Constantes.ESTADO_TERMINADO);
		if (estadoInspeccion != null) {
			model.addAttribute("estadoInspeccion", estadoInspeccion.getIdEstadoInspeccion());
		}

		model.addAttribute("inspeccion", inspeccion);

		return "datosBasicosDeInspeccion";
	}

	@RequestMapping(value = "/guardar/{protocoloCambiado}", method = RequestMethod.POST)
	public @ResponseBody Object guardar(@RequestBody() Inspecciones inspeccion,
			@ModelAttribute(value = "usuario") Usuario usuario, @PathVariable boolean protocoloCambiado)
			throws Exception {

		DatosBasicosDeInspeccionController.logger.info("[POST - Guardar] : guardamos de datos basicos de inspeccion");

		// Si el estado de la Inpeccion se cambia a terminada
		if (inspeccion != null && inspeccion.getEstadoInspeccion() != null
				&& inspeccion.getEstadoInspeccion().getIdEstadoInspeccion() != null
				&& inspeccion.getEstadoInspeccion().getIdEstadoInspeccion() != 0) {

			EstadosInspeccion estadoInspeccion = this.estadosInspeccionService.find(inspeccion.getEstadoInspeccion());
			RelExpIns relExpIns = new RelExpIns();
			//// el identificadorInspeccion viene a nulo, voy a la tabla
			//// AB7901T00 y recupero todo el registro
			relExpIns.setInspecciones(this.inspeccionesService.find(inspeccion));
			inspeccion.setUsuarioUltmodificacion(usuario.getUsuario());
			relExpIns.setUsuarioUltmodificacion(usuario.getUsuario());

			if (estadoInspeccion.getDesEstIns().getIdDesEstIns()
					.equals(Constantes.ESTADO_BASICO_INSPECCION_TERMINADA)) {

				Date fechaBD = null;

				Actuaciones actuaciones = this.actuacionesService.findMaxDateActuaciones(inspeccion.getIdInspeccion());
				if (actuaciones != null) {
					fechaBD = actuaciones.getFechaActuacion();
				}

				if (fechaBD != null && inspeccion.getFechaFinInspeccion().before(fechaBD)) {
					throw new Exception("errorFechaFinInspeccion");
				} else {
					// actualizamos Fecha fin Inspeccion en la tabla AB7901T00
					this.inspeccionesService.updateFechaFinInspeccion(inspeccion);

					// actulizamos Fecha fin Inspeccion en la tabla AB6143T00
					relExpIns.getInspecciones().setFechaFinInspeccion(inspeccion.getFechaFinInspeccion());

					this.relExpInsService.updateFechaFinInspeccion(relExpIns);
				}
			} else {
				// actualizamos Fecha fin Inspeccion en la tabla AB7901T00
				inspeccion.setFechaFinInspeccion(null);
				this.inspeccionesService.updateFechaFinInspeccion(inspeccion);
				// actulizamos Fecha fin Inspeccion en la tabla AB6143T00
				relExpIns.getInspecciones().setFechaFinInspeccion(null);
				this.relExpInsService.updateFechaFinInspeccion(relExpIns);
			}
		}

		if (inspeccion.getIdOrigenInspeccion() == Constantes.ORIGEN_CAMPAINA
				|| inspeccion.getIdOrigenInspeccion() == Constantes.ORIGEN_INSPECCION_OFICIO
				|| inspeccion.getIdOrigenInspeccion() == Constantes.ORIGEN_BUZON_FRAUDE) {

			// Actualizar título de la inspección
			String titulo = this.inspeccionesService.crearTitulo(inspeccion, null, null);
			if (inspeccion.getExpediente() != null && inspeccion.getExpediente().getIdExpediente() != null) {
				Expedientes expediente = this.expedientesService.find(inspeccion.getExpediente());
				expediente.setTitulo(titulo);
				expediente.setUsuarioUltmodificacion(usuario.getUsuario());

				DatosDirecciones datosDireccion = this.datosDireccionesService
						.findDomicilioUbicacion(expediente.getIdExpediente(), Constantes.ID_UBICACION_INVERSION);

				if (datosDireccion != null && datosDireccion.getProvincia() != null
						&& datosDireccion.getProvincia().getId() != null
						&& !"".equals(datosDireccion.getProvincia().getId())
						&& (Constantes.COD_PROVINCIA_ARABA.equals(datosDireccion.getProvincia().getId())
								|| Constantes.COD_PROVINCIA_BIZKAIA.equals(datosDireccion.getProvincia().getId())
								|| Constantes.COD_PROVINCIA_GIPUZKOA.equals(datosDireccion.getProvincia().getId()))) {
					Long idTerritorioHistorico = Long.parseLong(datosDireccion.getProvincia().getId());
					expediente.setIdTerritorioHistorico(idTerritorioHistorico);
				} else {
					expediente.setIdTerritorioHistorico(Long.parseLong(Constantes.COD_PROVINCIA_ARABA));
				}

				this.expedientesService.actualizarTituloTerritorioHistorico(expediente);

				this.ab61WebServiceAdaptadorService.actualizarTituloExpediente(expediente.getFolderId(), titulo);

			} else {
				RelEstIns relEstIns = new RelEstIns();
				relEstIns.setInspeccion(inspeccion);
				relEstIns.setTitulo(titulo);
				relEstIns.setUsuarioUltModificacion(usuario.getUsuario());
				this.relEstInsService.actualizarTituloInspeccion(relEstIns);
			}
		}

		if (protocoloCambiado) {
			this.respuestasProtocoloService.removeRespuestasFicherosByInspeccion(inspeccion);
		}

		if (null == inspeccion.getEstadoInspeccion() || inspeccion.getEstadoInspeccion().getIdEstadoInspeccion() == 0) {
			EstadosInspeccion estado = new EstadosInspeccion();
			inspeccion.setEstadoInspeccion(estado);
		}

		if (null == inspeccion.getResultadoInspeccion()
				|| inspeccion.getResultadoInspeccion().getIdResultadoInspeccion() == 0) {
			ResultadosInspeccion resultado = new ResultadosInspeccion();
			inspeccion.setResultadoInspeccion(resultado);
		}

		if (null == inspeccion.getIdProtocolo() || inspeccion.getIdProtocolo().getIdProtocolo() == 0) {
			Protocolos protocolo = new Protocolos();
			inspeccion.setIdProtocolo(protocolo);
		}

		if (null == inspeccion.getInspector() || inspeccion.getInspector().getIdInspector() == 0) {
			Inspectores inspectores = new Inspectores();
			inspeccion.setInspector(inspectores);
		}

		if (null == inspeccion.getCampaina() || inspeccion.getCampaina().getIdCampaina() == 0) {
			CampainasInspeccion campaina = new CampainasInspeccion();
			inspeccion.setCampaina(campaina);
		}

		if (null == inspeccion.getAgrupacion() || inspeccion.getAgrupacion().getIdAgrupacion() == 0) {
			Agrupaciones agrupacion = new Agrupaciones();
			inspeccion.setAgrupacion(agrupacion);
		}

		inspeccion.setUsuarioUltmodificacion(usuario.getUsuario());

		Inspecciones inspeccionesAux = this.inspeccionesService.updateDatosBasicos(inspeccion);

		return inspeccionesAux;
	}
}
