package com.ejie.ab79.control.expedientes;

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.context.i18n.LocaleContextHolder;
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 org.springframework.web.servlet.ModelAndView;

import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
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.DatosTerceros;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.expedientes.RelExpTer;
import com.ejie.ab79.model.expedientes.SubtipoTercero;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.expedientes.DatosDireccionesService;
import com.ejie.ab79.service.expedientes.DatosTercerosService;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.expedientes.RelExpTerService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.ab79.webservice.adaptadores.ab61WebServiceAdaptador;

/**
 * ExpedientesController  
 * 
 *  
 */

@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/expedientes")

public class ExpedientesController {

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

	@Autowired
	private InspeccionesService inspeccionesService;
	@Autowired
	private ExpedientesService expedientesService;
	@Autowired
	private RelExpTerService relExpTerService;
	@Autowired
	private RelEstInsService relEstInsService;
	@Autowired
	private DatosTercerosService datosTercerosService;
	@Autowired
	private DatosDireccionesService datosDireccionesService;
	@Autowired
	private ab61WebServiceAdaptador ab61WebServiceAdaptadorService;

	/**
	 * Cargamos la ficha expediente
	 * 
	 * @param model
	 *            Model
	 * @return String
	 * @throws Exception
	 */
	@RequestMapping(value = "/maint/{idInspeccion}", method = RequestMethod.GET)
	public ModelAndView get(Model model, @PathVariable Integer idInspeccion, Usuario usuario) throws Exception {
		ExpedientesController.logger.info("[GET - View] : expedientes");

		String idioma = LocaleContextHolder.getLocale().getLanguage();
		// buscar el folderId del expediente
		Expedientes expedientes = new Expedientes();

		Inspecciones inspecciones = new Inspecciones();
		inspecciones.setIdInspeccion(idInspeccion);

		inspecciones = this.inspeccionesService.find(inspecciones);

		if (inspecciones != null && inspecciones.getIdOrigenInspeccion() != null) {
			model.addAttribute("idOrigenInspeccion", inspecciones.getIdOrigenInspeccion());
		}

		expedientes.setInspeccion(inspecciones);

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

		if (expedientesAux != null && expedientesAux.getIdExpediente() != null) {

			if (inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_AYUDAS
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_CENSO
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_CAMPAINA
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_INSPECCION_OFICIO
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_DENUNCIAS
					|| inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_BUZON_FRAUDE) {

				try {
					boolean flagSearchFolder = this.expedientesService
							.actualizarParticipaciones(expedientesAux.getFolderId(), usuario.getUsuario());

					model.addAttribute("flagSearchFolder", flagSearchFolder);
				} catch (Exception e) {
					ExpedientesController.logger.error(e.getMessage(), e);
					model.addAttribute("flagSearchFolder", false);
				}
			} else {
				model.addAttribute("flagSearchFolder", true);
			}

			model.addAttribute("urlab61", UtilsConfig.getAppProperties().getProperty("URLAB61"));
			model.addAttribute("ab61_folderID", expedientesAux.getFolderId());
			model.addAttribute("idExpediente", expedientesAux.getIdExpediente());
			model.addAttribute("relacionExpediente", expedientesAux.getRelacionExpediente());
			model.addAttribute("idExpedienteOrigen", expedientesAux.getIdExpedienteOrigen());
			model.addAttribute("idInspeccion", idInspeccion);
			model.addAttribute("inspeccion", expedientesAux.getInspeccion());
			// Primero obtengo la lista de participaciones de mi BBDD, ya
			// actualiza previamente desde el webService
			List<RelExpTer> listaParticipantesParticipacion = relExpTerService
					.findParticipaciones(expedientesAux.getIdExpediente(), idInspeccion);
			ExpedientesController.logger.info("[INICIO] Participantes " + listaParticipantesParticipacion.size()
					+ " para el expediente : " + expedientesAux.getIdExpediente());

			Integer idTercero = 0;
			boolean mostrarDenunciado = true;
			boolean tieneParteInculpada = false;

			DatosDirecciones domicilioSolicitante = this.datosDireccionesService
					.findDomicilioUbicacion(expedientesAux.getIdExpediente(), Constantes.ID_DIRECCION_SOLICITANTE);

			DatosDirecciones ubicacionInversion = this.datosDireccionesService
					.findDomicilioUbicacion(expedientesAux.getIdExpediente(), Constantes.ID_UBICACION_INVERSION);

			if (inspecciones.getIdOrigenInspeccion() == Constantes.ORIGEN_DENUNCIAS) {
				for (RelExpTer participacion : listaParticipantesParticipacion) {
					if (participacion.getIdTipoParticipacion() == Constantes.PARTICIPACION_AFECTADO) {
						mostrarDenunciado = false;
					}
				}
				if (mostrarDenunciado) {
					List<DatosTerceros> listaDenunciados = this.datosTercerosService
							.findDenunciadoByExpediente(expedientesAux.getIdExpediente());
					model.addAttribute("listaDenunciados", listaDenunciados);
				}
			}

			for (RelExpTer participacion : listaParticipantesParticipacion) {
				if (participacion.getIdSubtipoParticipacion() == Constantes.PARTE_INCULPADA) {
					tieneParteInculpada = true;
				}
			}

			model.addAttribute("listaParticipantesParticipacion", listaParticipantesParticipacion);
			model.addAttribute("domicilioSolicitante", domicilioSolicitante);
			model.addAttribute("ubicacionInversion", ubicacionInversion);
			model.addAttribute("tieneParteInculpada", tieneParteInculpada);

			model.addAttribute("idDireccion", expedientesAux.getProcedimientos().getDirecciones().getIdDireccion());
			model.addAttribute("procedureId", expedientesAux.getProcedimientos().getCodProcedureId());
			model.addAttribute("idTercero", idTercero);
			model.addAttribute("lenguaje", idioma);
			model.addAttribute("mostrarDenunciado", mostrarDenunciado);
			return new ModelAndView("expedientes", "model", model);
		} else {
			model.addAttribute("idInspeccion", idInspeccion);
			model.addAttribute("flagSearchFolder", true);

			RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspecciones);
			DatosTerceros datosTercero = new DatosTerceros(relEstIns.getIdTercero());
			datosTercero = this.datosTercerosService.find(datosTercero);

			model.addAttribute("inspeccion", inspecciones);
			// Primero obtengo la lista de participaciones de mi BBDD, ya
			// actualiza previamente desde el webService
			List<RelExpTer> listaParticipantesParticipacion = relExpTerService.findParticipaciones(null, idInspeccion);
			if (listaParticipantesParticipacion.size() > 0) {

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

				model.addAttribute("listaParticipantesParticipacion", listaParticipantesParticipacion);
				model.addAttribute("ubicacionInversion", ubicacionInversion);
				model.addAttribute("idDireccion", inspecciones.getDireccion().getIdDireccion());
				if (datosTercero != null) {
					ExpedientesController.logger.info("[INICIO] Participantes id :" + datosTercero.getIdTercero());
					model.addAttribute("idTercero", datosTercero.getIdTercero());
				} else {
					ExpedientesController.logger.info("[INICIO] Participantes id :" + datosTercero);
				}
				model.addAttribute("lenguaje", idioma);
				return new ModelAndView("expedientes", "model", model);
			} else {
				return new ModelAndView("folderError");
			}
		}
	}

	/**
	 * Guardar ubicacion y direccion del solicitante y si es bec tambien la
	 * puntacuion
	 *
	 * @param relExpTerEmp
	 *            RelExpTerEmp Bean que contiene la informacion con la que se va
	 *            a crear el nuevo registro.
	 * @return RelExpTerEmp Bean resultante del proceso de creacion.
	 * @throws Exception
	 */
	@RequestMapping(value = "/guardarInteresadoUbicacion/{idInspeccion}", method = RequestMethod.POST)
	public String addDomicilioUbicacionSolicitante(HttpServletRequest request, Model model, Usuario usuario,
			@PathVariable("idInspeccion") Integer idInspeccion) throws Exception {

		Inspecciones inspeccion = new Inspecciones();
		inspeccion.setIdInspeccion(idInspeccion);

		inspeccion = this.inspeccionesService.find(inspeccion);

		String participantIds = request.getParameter("participantIds");
		String idsSubtipoTercero = request.getParameter("idsSubtipoTercero");

		if (!"".equals(idsSubtipoTercero) && idsSubtipoTercero != null) {

			String[] arraySubtiposTercero = idsSubtipoTercero.split(",");
			String[] arrayParticipantIds = participantIds.split(",");

			if (arrayParticipantIds.length == arraySubtiposTercero.length) {

				for (int i = 0; i < arraySubtiposTercero.length; i++) {
					RelExpTer relExpTerAux = new RelExpTer();

					relExpTerAux.setParticipantId(arrayParticipantIds[i]);
					SubtipoTercero subtipoTerceroAux = new SubtipoTercero();
					subtipoTerceroAux.setIdSubtipoTercero(Integer.parseInt(arraySubtiposTercero[i]));
					relExpTerAux.setSubtipoTercero(subtipoTerceroAux);
					relExpTerAux.setUsuarioUltmodificacion(usuario.getUsuario());

					this.relExpTerService.updateSubtipo(relExpTerAux);
				}

			}

		}

		if (inspeccion.getIdOrigenInspeccion().equals(Constantes.ORIGEN_CAMPAINA)
				|| inspeccion.getIdOrigenInspeccion().equals(Constantes.ORIGEN_INSPECCION_OFICIO)
				|| inspeccion.getIdOrigenInspeccion().equals(Constantes.ORIGEN_BUZON_FRAUDE)) {
			DatosDirecciones datosDirecciones = this.relExpTerService.addDomicilioUbicacionSolicitante(request, model,
					usuario, inspeccion);

			if (!inspeccion.getIdOrigenInspeccion().equals(Constantes.ORIGEN_BUZON_FRAUDE)) {
				String titulo = this.inspeccionesService.crearTitulo(inspeccion, null, datosDirecciones);

				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);

				}
			}

		}

		return "redirect:/fichadeinspeccion/maint/" + idInspeccion;

	}

	@RequestMapping(value = "/guardarSinExpediente/{idInspeccion}", method = RequestMethod.POST)
	public String guardarSinExpediente(HttpServletRequest request, Model model, Usuario usuario,
			@PathVariable("idInspeccion") Integer idInspeccion) {

		this.relEstInsService.guardarSinExpediente(request, model, usuario, idInspeccion);

		return "redirect:/fichadeinspeccion/maint/" + idInspeccion;
	}

	@RequestMapping(value = "/aniadirInteresado/{idInspeccion}", method = RequestMethod.POST)
	public @ResponseBody DatosTerceros aniadirInteresado(@RequestBody DatosTerceros datosTercero,
			@PathVariable Integer idInspeccion, @ModelAttribute("usuario") Usuario usuario) {

		return this.expedientesService.aniadirInteresado(datosTercero, idInspeccion, usuario);
	}

}
