package com.ejie.t17i.control;

import java.util.List;
import java.util.Locale;

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.PathVariable;
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.model.Municipio;
import com.ejie.t17i.model.Provincia;
import com.ejie.t17i.service.MunicipioService;

/**
 * * ProvinciasController generated, 29-feb-2012 13:24:29.
 * 
XXXX
 */

@Controller
@RequestMapping(value = "/municipios")
public class MunicipiosController {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(MunicipiosController.class);

	@Autowired
	private MunicipioService municipioService;

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idMunicipio
	 *            String
	 * @param idProvincia
	 *            String
	 * @return Municipio Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = "/{idProvincia}/{idMunicipio}", method = RequestMethod.GET)
	public @ResponseBody
	Municipio get(@PathVariable String idMunicipio,
			@PathVariable String idProvincia) {
		Municipio municipio = new Municipio(idMunicipio, new Provincia(
				idProvincia));
		municipio = this.municipioService.find(municipio);
		MunicipiosController.LOGGER
				.info("[GET - findBy_PK] : Obtener Municipio por PK");
		return municipio;
	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idProvincia
	 *            String
	 * @param descripcion
	 *            String
	 * @param entity
	 *            String
	 * @param request
	 *            HttpServletRequest
	 * @return List<Municipio> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */

	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody
	List<Municipio> getAll(
			@RequestParam(value = "idProvincia", required = false) String idProvincia,
			@RequestParam(value = "descripcion", required = false) String descripcion,
			@RequestParam(value = "entity", required = false) String entity,
			HttpServletRequest request) {
		MunicipiosController.LOGGER
				.info("[GET - find_ALL] : Obtener MunicipioS por filtro");
		String provinciaIdEntity = request
				.getParameter(entity + "provincia.id");

		if (idProvincia == null || "".equals(idProvincia)) {
			if (provinciaIdEntity == null || "".equals(provinciaIdEntity)) {
				return null;
			}
		} else {
			provinciaIdEntity = idProvincia;
		}
		final Provincia prov = new Provincia(provinciaIdEntity);
		Municipio filterMunicipio = new Municipio(prov);
		filterMunicipio.setNombre(descripcion);
		return this.municipioService.findAll(filterMunicipio, null);
	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 * 
	 * @param idProvincia
	 *            String
	 * @param descripcion
	 *            String
	 * @param request
	 *            HttpServletRequest
	 * @param locale
	 *            Locale
	 * @return List<Municipio> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	@RequestMapping(value = "/autocomplete", method = RequestMethod.GET)
	public @ResponseBody
	List<Municipio> getAllLike(
			@RequestParam(value = "idProvincia", required = false) String idProvincia,
			@RequestParam(value = "q", required = false) String descripcion,
			HttpServletRequest request, Locale locale) {
		MunicipiosController.LOGGER
				.info("[GET - find_ALL] : Obtener MunicipioS por filtro LIKE");
		final Provincia prov = new Provincia(idProvincia);
		Municipio filterMunicipio = new Municipio(prov);
		filterMunicipio.setNombre(descripcion);
		return this.municipioService.findAllLike(filterMunicipio, null, false);
	}

}
