package com.ejie.t17i.control;

import java.math.BigDecimal;
import java.util.ArrayList;
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.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ejie.t17i.filters.ProvinciaFilter;
import com.ejie.t17i.model.Localidad;
import com.ejie.t17i.model.Pais;
import com.ejie.t17i.model.Calle;
import com.ejie.t17i.model.Municipio;
import com.ejie.t17i.model.Planta;
import com.ejie.t17i.model.Portal;
import com.ejie.t17i.model.Provincia;
import com.ejie.t17i.service.CalleService;
import com.ejie.t17i.service.LocalidadService;
import com.ejie.t17i.service.MunicipioService;
import com.ejie.t17i.service.PaisService;
import com.ejie.t17i.service.PlantaService;
import com.ejie.t17i.service.PortalService;
import com.ejie.t17i.service.ProvinciaService;
/**
 * * CallesController generated, 21-may-2012 13:24:29.
 * 
XXXX
 */

@Controller
@RequestMapping(value = "/nora")
public class NoraController {

	private static final Logger LOGGER = LoggerFactory.getLogger(NoraController.class);
	@Autowired
	private PaisService paisService;
	@Autowired
	private ProvinciaService provinciaService;
	@Autowired
	private MunicipioService municipioService;
	@Autowired
	private LocalidadService localidadService;
	@Autowired
	private CalleService calleService;
	@Autowired
	private PortalService portalService;
	@Autowired
	private PlantaService plantaService;

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param descripcion Texto introducido para filtrar
	 * @param request Request
	 * @return List<Pais> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/pais", method = RequestMethod.GET)
	public @ResponseBody
	List<Pais> autocompletePais(
			@RequestParam(value = "q", required = false)final  String descripcion,
			final HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL_Like] : Obtener Pais por filtro");
		final Pais filterPais = new Pais();
		filterPais.setNombre(descripcion);
		return this.paisService.findAllLike(filterPais, null,false);
	}
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param descripcion Texto introducido para filtrar
	 * @param soloCAPV Si devuelve solo de la CAPV
	 * @param request Request
	 * @return List<Provincia> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/provincia", method = RequestMethod.GET)
	public @ResponseBody
	List<Provincia> autocompleteProvincia(
			@RequestParam(value = "q", required = false)final  String descripcion,
			@RequestParam(value = "soloCAPV", required = false) final Boolean soloCAPV,
			final HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL_Like] : Obtener Provincias por filtro");
		final ProvinciaFilter filterProvincia = new ProvinciaFilter();
		filterProvincia.setNombre(descripcion);
		filterProvincia.setSoloCAPV(soloCAPV!=null? soloCAPV : false);
		return this.provinciaService.findAllLike(filterProvincia, null,false);
	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idProvincia Provincia para filtrar
	 * @param descripcion Texto introducido para filtrar
	 * @param request Request
	 * @return List<Municipio> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	@RequestMapping(value = "/autocomplete/municipio", method = RequestMethod.GET)
	public @ResponseBody
	List<Municipio> autocompleteMunicipio(
			@RequestParam(value = "idProvincia", required = false)final String idProvincia,
			@RequestParam(value = "q", required = false)final String descripcion,
			final HttpServletRequest request) {
		NoraController.LOGGER
		.info("[GET - find_ALL] : Obtener MunicipioS por filtro LIKE");
			final Provincia prov = new Provincia(idProvincia);
			final Municipio filterMunicipio = new Municipio(prov);
			filterMunicipio.setNombre(descripcion);
			return this.municipioService.findAllLike(filterMunicipio, null,false);
	}
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idProvincia Provincia para filtrar
	 * @param idMunicipio d
	 * @param entity <code>name</code> que hace referencia a la <code>Calle</code>
	 * @param descripcion Texto introducido para filtrar
	 * @param request Request
	 * @return List<Localidad> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/localidad", method = RequestMethod.GET)
	public @ResponseBody
	List<Localidad> autocompleteLocalidad(
			@RequestParam(value = "idProvincia", required = false)final String idProvincia,
			@RequestParam(value = "idMunicipio", required = false)final String idMunicipio,
			@RequestParam(value = "q", required = false)final String descripcion,
			@RequestParam(value = "entity", required = false)final String entity,
			HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL] : Obtener Localidades por filtro");
		final String provinciaIdEntity = request.getParameter(entity+"provincia.id");
		final String municipioIdEntity = request.getParameter(entity+"municipio.id");
		List<Localidad> listaLocalidades=new ArrayList<Localidad>();
		String provinciaFilter= idProvincia;
		String municipioFilter= idMunicipio;
		if((idProvincia==null || "".equals(idProvincia))&&
			(provinciaIdEntity!=null && !"".equals(provinciaIdEntity))){
				provinciaFilter = provinciaIdEntity;
		}
		if((idMunicipio==null || "".equals(idMunicipio))&&
				(municipioIdEntity!=null && !"".equals(municipioIdEntity))){
			municipioFilter = municipioIdEntity;
		}
		if(!("".equals(provinciaFilter)) && !("".equals(municipioFilter))){
			final Provincia prov = new Provincia(provinciaFilter);
			final Municipio munAux = new Municipio(municipioFilter, prov);
			final Localidad filterLocalidad = new Localidad();
			filterLocalidad.setMunicipio(munAux);
			filterLocalidad.setNombre(descripcion);
			listaLocalidades=this.localidadService.findAllLike(filterLocalidad, null,false);
		}
		return listaLocalidades;
	}
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idProvincia Provincia para filtrar
	 * @param idMunicipio Municipio para filtrar
	 * @param entity <code>name</code> que hace referencia a la <code>Calle</code>
	 * @param descripcion Texto introducido para filtrar
	 * @param request d
	 * @return List<Calle> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/calle", method = RequestMethod.GET)
	public @ResponseBody
	List<Calle> autocompleteCalle(
			@RequestParam(value = "idProvincia", required = false)final  String idProvincia,
			@RequestParam(value = "idMunicipio", required = false)final  String idMunicipio,
			@RequestParam(value = "q", required = false)final  String descripcion,
			@RequestParam(value = "entity", required = false)final  String entity,
			HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL] : Obtener Calles por filtro");
		final String provinciaIdEntity = request.getParameter(entity+"provincia.id");
		final String municipioIdEntity = request.getParameter(entity+"municipio.id");
		String provinciaFilter= idProvincia;
		String municipioFilter= idMunicipio;
		List<Calle> listaCalles=new ArrayList<Calle>();
		if((idProvincia==null || "".equals(idProvincia))&&
			(provinciaIdEntity!=null && !("".equals(provinciaIdEntity)))){
				provinciaFilter = provinciaIdEntity;
		}
		if((idMunicipio==null || "".equals(idMunicipio))&&
				(municipioIdEntity!=null && !("".equals(municipioIdEntity)))){
				municipioFilter = municipioIdEntity;
		}
		if(!("".equals(provinciaFilter)) && !("".equals(municipioFilter))){
			final Provincia prov = new Provincia(provinciaFilter);
			final Municipio munAux = new Municipio(municipioFilter, prov);
			final Calle filterCalle = new Calle();
			filterCalle.setMunicipio(munAux);
			filterCalle.setNombreEs(descripcion);
			listaCalles= this.calleService.findAllLike(filterCalle, null,false);
		}
		return listaCalles;
	}
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idCalle d
	 * @param entity <code>name</code> que hace referencia al <code>Calle</code>
	 * @param descripcion Texto introducido para filtrar
	 * @param request Request
	 * @return List<Calle> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/cp", method = RequestMethod.GET)
	public @ResponseBody
	List<Portal> autocompleteCP(
			@RequestParam(value = "idCalle", required = false) final String idCalle,
			@RequestParam(value = "q", required = false)final  String descripcion,
			@RequestParam(value = "entity", required = false) final String entity,
			final HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL] : Obtener Portales por filtro");
		String idCalleEntity=null;
		List<Portal> listaPortales=new ArrayList<Portal>();
		if(idCalle==null || "".equals(idCalle)){
			if(!(request.getParameter(entity+"calle.id")==null || "".equals(request.getParameter(entity+"calle.id")))){
				idCalleEntity = request.getParameter(entity+"calle.id");
			}
			
		}
		else{
			idCalleEntity=idCalle;
		}
		if(idCalleEntity!=null && !("".equals(idCalleEntity))){
			final Calle calleAux = new Calle(BigDecimal.valueOf(Long.valueOf(idCalleEntity)));
			final Portal filterPortal = new Portal();
			filterPortal.setCalle(calleAux);
			//TODO como filtrar el texto del portal? bloque-num-bis
			//filterPortal.setComboDesc(descripcion);
			 listaPortales=this.portalService.findAllLikeCP(filterPortal, null,false);
		} 
		
		 return listaPortales;
	}
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idCalle d
	 * @param entity <code>name</code> que hace referencia a la <code>Calle</code>
	 * @param descripcion Texto introducido para filtrar
	 * @param request Request
	 * @return List<Calle> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/portal", method = RequestMethod.GET)
	public @ResponseBody
	List<Portal> autocompletePortal(
			@RequestParam(value = "idCalle", required = false) final String idCalle,
			@RequestParam(value = "q", required = false)final  String descripcion,
			@RequestParam(value = "entity", required = false) final String entity,
			final HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL] : Obtener Portales por filtro");
		String idCalleEntity=null;
		List<Portal> listaPortales=new ArrayList<Portal>();
		if(idCalle==null || "".equals(idCalle)){
			if(!(request.getParameter(entity+"calle.id")==null || "".equals(request.getParameter(entity+"calle.id")))){
				idCalleEntity = request.getParameter(entity+"calle.id");
			}
			
		}
		else{
			idCalleEntity=idCalle;
		}
		if(idCalleEntity!=null && !("".equals(idCalleEntity))){
			final Calle calleAux = new Calle(BigDecimal.valueOf(Long.valueOf(idCalleEntity)));
			final Portal filterPortal = new Portal();
			filterPortal.setCalle(calleAux);
			//TODO como filtrar el texto del portal? bloque-num-bis
			filterPortal.setComboDesc(descripcion);
			 listaPortales=this.portalService.findAllLike(filterPortal, null,false);
		} 
		
		 return listaPortales;
	}
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idPortal Portal
	 * @param entity Entidad
	 * @param descripcion Descripcion
	 * @param request request
	 * @return List<Calle> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/planta/escalera", method = RequestMethod.GET)
	public @ResponseBody
	List<Planta> autocompleteEscalera(
			@RequestParam(value = "idPortal", required = false) final String idPortal,
			@RequestParam(value = "q", required = false)final  String descripcion,
			@RequestParam(value = "entity", required = false) final String entity,
			final HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL] : Obtener Escaleras por filtro");
String idPortalEntity=null;
		
		if(idPortal==null || "".equals(idPortal)){
			if(!(request.getParameter(entity+"portal.id")==null || "".equals(request.getParameter(entity+"portal.id")))){
				idPortalEntity = request.getParameter(entity+"portal.id");
			}
			
		}
		else{
			idPortalEntity=idPortal;
		}
		if(idPortalEntity==null || "".equals(idPortalEntity)){
			return null;
		} 
		final Portal portalAux = new Portal(BigDecimal.valueOf(Long.valueOf(idPortalEntity)));
		final Planta filterPlanta = new Planta();
		filterPlanta.setPortal(portalAux);	
		filterPlanta.setEscalera(descripcion);
		return this.plantaService.findAllLikeEscalera(filterPlanta, null,false);
	}
	
	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idPortal Portal
	 * @param entity Entidad
	 * @param escalera escalera
	 * @param descripcion Descripcion
	 * @param request request
	 * @return List<Calle> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	
	@RequestMapping(value = "/autocomplete/planta/piso", method = RequestMethod.GET)
	public @ResponseBody
	List<Planta> autocompletePiso(
			@RequestParam(value = "idPortal", required = false) final String idPortal,
			@RequestParam(value = "q", required = false)final  String descripcion,
			@RequestParam(value = "escalera", required = false) final String escalera,
			@RequestParam(value = "entity", required = false) final String entity,
			final HttpServletRequest request) {
		NoraController.LOGGER
				.info("[GET - find_ALL] : Obtener Piso por filtro");
String idPortalEntity=null;
		
		if(idPortal==null || "".equals(idPortal)){
			if(!(request.getParameter(entity+"portal.id")==null || "".equals(request.getParameter(entity+"portal.id")))){
				idPortalEntity = request.getParameter(entity+"portal.id");
			}
			
		}
		else{
			idPortalEntity=idPortal;
		}
		if(idPortalEntity==null || "".equals(idPortalEntity)){
			return null;
		} 
		final Portal portalAux = new Portal(BigDecimal.valueOf(Long.valueOf(idPortalEntity)));
		final Planta filterPlanta = new Planta();
		filterPlanta.setPortal(portalAux);	
		filterPlanta.setEscalera(escalera);
		filterPlanta.setPiso(descripcion);
		return this.plantaService.findAllLike(filterPlanta, null,false);
	}
}
