package com.ejie.ad74a.control;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
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.GetMapping;
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.ad74a.constantes.Constantes;
import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.model.comun.Calle;
import com.ejie.ad74a.model.comun.Localidad;
import com.ejie.ad74a.model.comun.Municipio;
import com.ejie.ad74a.model.comun.Pais;
import com.ejie.ad74a.model.comun.Portal;
import com.ejie.ad74a.model.comun.Provincia;
import com.ejie.ad74a.model.comun.Tramo;
import com.ejie.ad74a.service.comun.NoraService;
import com.ejie.ad74a.util.comun.Utilidades;

/**
 * OngLocalController generated by UDA, 21-may-2019 8:09:49.
 * 
 * @author UDA
 */

@Controller
@RequestMapping(value = "/nora")

public class NoraController {

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

	@Autowired
	private NoraService noraService;

	/**
	 * Obtenemos las provincias de la CAP
	 * 
	 * @return List<Provincia>
	 */
	@RequestMapping(value = "/provincias", method = RequestMethod.GET)
	public @ResponseBody List<Provincia> findAllProvinciasCAP() {
		return this.noraService.findProvinciasCAP();
	}

	/**
	 * Obtener todas las provincias que son de la CAP
	 * 
	 * @return List<Provincia>
	 */
	@RequestMapping(value = "/allProvincias", method = RequestMethod.GET)
	public @ResponseBody List<Provincia> findAllProvincias() {
		return this.noraService.findAllProvincias();
	}

	/**
	 * Obtener todas las provincias que son de la CAP
	 * 
	 * @return List<Provincia>
	 */
	@RequestMapping(value = "/allProvinciasNoCAP", method = RequestMethod.GET)
	public @ResponseBody List<Provincia> findAllProvinciasNoCAP() {
		return this.noraService.findAllProvinciasNoCAP();
	}

	/**
	 * Obtenemos las provincias
	 * 
	 * @param request
	 * @return
	 */

	@GetMapping(value = "/paises")
	public @ResponseBody List<Combo> findAllPaises(HttpServletRequest request) {
		List<Pais> paises = this.noraService.findAllPaises(new Pais());
		List<Combo> listaPaises = new ArrayList();
		for (Pais p : paises) {
			Combo aux = new Combo(p.getCodPais(), p.getDescripcion(), p.getDescripcionEu());
			listaPaises.add(aux);
		}
		return listaPaises;
	}

	/**
	 * Devuelve una lista de localidades con el codigo de provincia, el codigo de
	 * municipio, el codigo de localidad y la descripcion para el codigo postal que
	 * se pasa por parametro
	 * 
	 * @param request HttpServletRequest
	 * @return List<Localidad> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */

	@GetMapping(value = "/findByCodPostal")
	public @ResponseBody List<Localidad> findByCodigoPostal(
			@RequestParam(value = "cp06", required = true) String codPostal) {
		return this.noraService.findByCodPostal(codPostal);
	}

	/**
	 * Devuelve la lista de Municipio, para un combo.
	 * 
	 * @param request HttpServletRequest
	 * @return List<Municipio> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */

	@GetMapping(value = "/municipioEnlazado")
	public @ResponseBody List<Municipio> getComboMunicipioEnlazado(
			@RequestParam(value = "codProvincia", required = false) String codProvincia,
			@RequestParam(value = "direcciones.idProvincia06", required = false) String codProvinciaDireccion,
			@RequestParam(value = "direccionNotif.idProvincia06", required = false) String codProvinciaNot,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idProvincia06", required = false) String codProvinciaEst,
			@RequestParam(value = "cp06", required = false) String codPostal,
            @RequestParam(value = "q", required = false) String q,
            @RequestParam(value = "c", required = false) Boolean c) {
		String codProv = codProvincia!= null ?codProvincia:codProvinciaDireccion != null ? codProvinciaDireccion : codProvinciaNot;
		codProv = codProvinciaEst != null ? codProvinciaEst : codProv;
		return comboMunicipiosEnlazados(codProv, codPostal,q);
	}

	/**
	 * Devuelve la lista de Municipio, para un combo.
	 * 
	 * @param request HttpServletRequest
	 * @return List<Municipio> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */

	@GetMapping(value = "/municipioEnlazadoProvincia")
	public @ResponseBody List<Municipio> getComboMunicipioEnlazado2(
			@RequestParam(value = "provincia.codProvincia", required = false) String codProvincia) {
		return comboMunicipiosEnlazados(codProvincia, null);
	}
	private List<Municipio> comboMunicipiosEnlazados(String codProvincia, String codPostal) {
		return comboMunicipiosEnlazados(codProvincia, codPostal,null);
	}
	private List<Municipio> comboMunicipiosEnlazados(String codProvincia, String codPostal,String descripcion) {
		Municipio filterMunicipio = new Municipio();
		filterMunicipio.setCodProvincia(codProvincia);
		filterMunicipio.setCodPostal(codPostal);
		filterMunicipio.setDescripcion(descripcion);
		return this.noraService.findAllMunicipios(filterMunicipio);
	}

	
	@GetMapping(value = "/findLocalidadByCallePortal")
	public @ResponseBody Localidad findLocalidadByCallePortal(HttpServletRequest request,
			@RequestParam(value = "codCalle", required = false) String codCalle,
			@RequestParam(value = "codPortal", required = false) String codPortal){
		if(!Utilidades.isEmpty(codPortal)) {
			Portal portal=this.noraService.findPortal(new Portal(Boolean.FALSE.equals(Utilidades.isEmpty(codPortal)) ? Long.valueOf(codPortal) : null));
			return new Localidad(portal.getCodLocalidad());
		
		}else if(!Utilidades.isEmpty(codCalle)) {
				// TRAMO
				Tramo filterTramo = new Tramo();
				// CALLE
				Calle filterCalle = new Calle(
						Boolean.FALSE.equals(Utilidades.isEmpty(codCalle)) ? Long.valueOf(codCalle) : null);
				filterTramo.setCalle(filterCalle);
				List<Localidad>localidades =this.noraService.findAllLocalidadesCalle(filterTramo);
				return localidades.size()>0?localidades.get(0):null;
		}
		return new Localidad();
	}
			
	@GetMapping(value = "/localidadEnlazado")
	public @ResponseBody List<Localidad> getComboLocalidadEnlazado(HttpServletRequest request,
			@RequestParam(value = "direcciones.idProvincia06", required = false) String codProvinciaDireccion,
			@RequestParam(value = "codProvincia", required = false) String codProvincia,
			@RequestParam(value = "direcciones.idMunicipio06", required = false) String codMunicipioDireccion,
			@RequestParam(value = "codMunicipio", required = false) String codMunicipio,
			@RequestParam(value = "cp06", required = false) String codPostal,
			@RequestParam(value = "direcciones.idCalle06", required = false) String idCalle,
			@RequestParam(value = "direccionNotif.idProvincia06", required = false) String codProvinciaDireccionNot,
			@RequestParam(value = "direccionNotif.idMunicipio06", required = false) String codMunicipioDireccionNot,
			@RequestParam(value = "direccionNotif.idCalle06", required = false) String idCalleNot,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idProvincia06", required = false) String codProvinciaDireccionEst,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idMunicipio06", required = false) String codMunicipioDireccionEst,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idCalle06", required = false) String idCalleEst,
            @RequestParam(value = "q", required = false) String q,
            @RequestParam(value = "c", required = false) Boolean c) {
		String codProv = codProvinciaDireccion != null ? codProvinciaDireccion : codProvinciaDireccionNot;
		codProv = codProvinciaDireccionEst != null ? codProvinciaDireccionEst : codProv;
		codProv = codProvincia != null ? codProvincia : codProv;

		String codMun = codMunicipioDireccion != null ? codMunicipioDireccion : codMunicipioDireccionNot;
		codMun = codMunicipioDireccionEst != null ? codMunicipioDireccionEst : codMun;
		codMun = codMunicipio != null ? codMunicipio : codMun;

		String idCall = idCalle != null ? idCalle : idCalleNot;
		idCall = idCalleEst != null ? idCalleEst : idCall;

		return comboLocalidadEnlazado(codProv, codMun, codPostal, idCall,q);
	}

	private List<Localidad> comboLocalidadEnlazado(String codProvinciaDireccion, String codMunicipioDireccion,
			String codPostal, String idCalle, String descripcion) {
		// LOCALIDAD
		String codMunicipio = codMunicipioDireccion;
		String codProvincia = codProvinciaDireccion;
		Localidad filterEntidadLocalidad = new Localidad();
		filterEntidadLocalidad.setCodMunicipio(codMunicipio);
		filterEntidadLocalidad.setCodProvincia(codProvincia);
		filterEntidadLocalidad.setDescripcion(descripcion);
		// Si son de la CAPV filtramos por el Tramo y Calle
		if (Constantes.DEL_ALAVA.equals(codProvincia) || Constantes.DEL_GIPUZKOA.equals(codProvincia)
				|| Constantes.DEL_BIZKAIA.equals(codProvincia)) {
			// TRAMO
			Tramo filterTramo = new Tramo();
			filterTramo.setLocalidad(filterEntidadLocalidad);
			// CALLE
			Calle filterCalle = new Calle(
					Boolean.FALSE.equals(Utilidades.isEmpty(idCalle)) ? Long.valueOf(idCalle) : null);
			filterTramo.setCalle(filterCalle);
			filterTramo.setCodPostal(codPostal);
			return this.noraService.findAllLocalidadesCalle(filterTramo);
		} else {
			// Si no son de la CAPV buscamos por Localidad directamente
			return this.noraService.findAllLocalidades(filterEntidadLocalidad);
		}
	}

	@GetMapping(value = "/calleEnlazado")
	public @ResponseBody List<Calle> getComboCalleEnlazado(HttpServletRequest request,
			@RequestParam(value = "codProvincia", required = false) String codProvincia,
			@RequestParam(value = "codMunicipio", required = false) String codMunicipio,
			@RequestParam(value = "codLocalidad", required = false) String codLocalidad,
			@RequestParam(value = "direcciones.idLocalidad06", required = false) String codLocalidadDepre,
			@RequestParam(value = "direccionNotif.idLocalidad06", required = false) String codLocalidadNotif,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idLocalidad06", required = false) String codLocalidadEst,
			@RequestParam(value = "cp06", required = true) String codPostal,
            @RequestParam(value = "q", required = false) String q,
            @RequestParam(value = "c", required = false) Boolean c) {
		if(codProvincia!=null && codMunicipio!=null) {
			if(!Utilidades.isEmpty(codLocalidad)) {
				return comboCalleEnlazado(codLocalidad, codPostal);
			}else {
				return comboCalleEnlazadoProvMuni(codProvincia, codMunicipio,codLocalidad,q);
			}
		}
		String codLoc = codLocalidadDepre != null ? codLocalidadDepre : codLocalidadNotif;
		codLoc = codLocalidadEst != null ? codLocalidadEst : codLoc;
		return comboCalleEnlazado(codLoc, codPostal);
	}
	private List<Calle> comboCalleEnlazadoProvMuni(String codProvincia, String codMunicipio, String codLocalidad, String desCalle) {
		
			Calle filterEntidadCalle = new Calle();
			filterEntidadCalle.setCodProvincia(codProvincia);
			filterEntidadCalle.setCodMunicipio(codMunicipio);
			filterEntidadCalle.setCodLocalidad(codLocalidad);
			filterEntidadCalle.setCalleTxt(desCalle);
			return this.noraService.findAllCallesProvMuni(filterEntidadCalle);
	}
	private List<Calle> comboCalleEnlazado(String codLocalidad, String codPostal) {
		if (!Utilidades.isEmpty(codLocalidad)) {
			// TRAMO
			Tramo filterTramo = new Tramo();
			filterTramo.setLocalidad(new Localidad(Long.valueOf(codLocalidad)));
			// CALLE
			Calle filterCalle = new Calle();
			filterTramo.setCalle(filterCalle);
			filterTramo.setCodPostal(codPostal);
			return this.noraService.findAllCallesLocalidad(filterTramo);

		} else {
			Calle filterEntidadCalle = new Calle();
			return this.noraService.findAllCalles(filterEntidadCalle);
		}
	}

	@GetMapping(value = "/portalEnlazado")
	public @ResponseBody List<Portal> getPortalEnlazado(HttpServletRequest request,
			@RequestParam(value = "codCalle", required = false) String codCalle,
			@RequestParam(value = "direcciones.idLocalidad06", required = false) String codLocalidad,
			@RequestParam(value = "direccionNotif.idLocalidad06", required = false) String codLocalidadNot,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idLocalidad06", required = false) String codLocalidadEst,
			@RequestParam(value = "direcciones.idCalle06", required = false) String idCalle06,
			@RequestParam(value = "cp06", required = false) String codPostal,
			@RequestParam(value = "direccionNotif.idCalle06", required = false) String idCalle06Not,
			@RequestParam(value = "tramitesExpediente.expediente.direcciones.idCalle06", required = false) String idCalle06Est,
            @RequestParam(value = "q", required = false) String q,
            @RequestParam(value = "c", required = false) Boolean c) {
		String codLoc = codLocalidad != null ? codLocalidad : codLocalidadNot;
		codLoc = codLocalidadEst != null ? codLocalidadEst : codLoc;
		String codCall = idCalle06 != null ? idCalle06 : idCalle06Not;
		codCall = idCalle06Est != null ? idCalle06Est : codCall;
		codCall = codCalle != null ? codCalle : codCall;
		String codCP = StringUtils.trimToNull(codPostal);
		return portalEnlazado(codLoc, codCall, codCP,q);

	}

	@GetMapping(value = "/conseguirCP")
	public @ResponseBody String getCp(HttpServletRequest request,
			@RequestParam(value = "portal", required = false) String idPortal) {

		return this.noraService.getCp(idPortal).trim();

	}

	private List<Portal> portalEnlazado(String codLocalidad, String codCalle, String codCP,String q) {
		if (Utilidades.isEmpty(codLocalidad) && Utilidades.isEmpty(codCalle)) {
			return new ArrayList<Portal>();
		} else {
			Portal filterPortal = new Portal();
			filterPortal.setCodLocalidad(!Utilidades.isEmpty(codLocalidad) ? Long.valueOf(codLocalidad) : null);
			filterPortal.setCodCalle(!Utilidades.isEmpty(codCalle) ? Long.valueOf(codCalle) : null);
			filterPortal.setCodPostal(!Utilidades.isEmpty(codCP) ? codCP : null);
			filterPortal.setNumeroString(q);
			return this.noraService.findAllPortales(filterPortal);
		}
	}

}
