package com.ejie.ab63.control;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.ejie.ab63.comun.utilidades.config.Config;
import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.EstablecimientoData;
import com.ejie.ab63.model.HabitacionVivienda;
import com.ejie.ab63.model.OtrasDependenciasVivienda;
import com.ejie.ab63.model.inicio.InitFormEst;
import com.ejie.ab63.model.plantillas.ParametrosConfig;
import com.ejie.ab63.model.util.ErrorResultAjaxOperation;
import com.ejie.ab63.model.util.ResultAjaxOperation;
import com.ejie.ab63.model.util.SuccessResultAjaxOperation;
import com.ejie.ab63.service.EstablecimientoDataService;
import com.ejie.ab63.service.EstablecimientoService;
import com.ejie.ab63.service.HabitacionViviendaService;
import com.ejie.ab63.service.OtrasDependenciasViviendaService;
import com.ejie.ab63.service.plantillas.ParametrosConfigService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;

/**
 * 
 *  
 *
 */
@Controller
@RequestMapping(value = "/datosEspecificos")
public class DatosEspecificosController {

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

	private final String CONTROLADOR = "datosEspecificos";

	@Autowired
	private EstablecimientoService establecimientoService;

	@Autowired
	private HabitacionViviendaService habitacionViviendaService;

	@Autowired
	private OtrasDependenciasViviendaService otrasDependenciasViviendaService;

	@Autowired
	private EstablecimientoDataService establecimientoDataService;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	/**
	 * Guarda los datos del formulario formDatosEspecificos
	 * 
	 * @param model
	 * @param establecimiento
	 * @return
	 */
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public @ResponseBody ResultAjaxOperation saveDatosEspecificos(
			@ModelAttribute("establecimiento") Establecimiento establecimiento) {

		DatosEspecificosController.logger.info("saveDatosEspecificos");

		try {

			this.establecimientoService.updateDatosEspecificos(establecimiento);

		} catch (Exception e) {

			DatosEspecificosController.logger.info("saveDatosEspecificos " + e.getMessage());

			return new ErrorResultAjaxOperation("error");

		}

		return new SuccessResultAjaxOperation("success");
	}

	/**
	 * Obtiene la vista y carga los datos en la misma
	 * 
	 * @param model
	 * @param initFormEst
	 * @return
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.POST)
	public ModelAndView getDatosEspecificosView(Model model,
			@ModelAttribute(value = "initFormEst") InitFormEst initFormEst) {
		DatosEspecificosController.logger.info("getDatosEspecificosView");

		Establecimiento establecimiento = new Establecimiento();


		ParametrosConfig parametrosConfigFind = new ParametrosConfig();
		parametrosConfigFind.setDescripcion(Constantes.ACTIVADA_PUBLICACION_AA80T);
		ParametrosConfig parametrosConfig = this.parametrosConfigService.find(parametrosConfigFind);

		if (parametrosConfig.getValor() == 1) {
			model.addAttribute("ACTIVAR_PUBLICACION", "1");
		}
		establecimiento.setIdEstablecimiento(Integer.parseInt(initFormEst.getIdEstablecimiento()));
		establecimiento = this.establecimientoService.find(establecimiento);

		String tipoEstablecimiento = establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento();
		initFormEst.setTipoEstablecimiento(establecimiento.getTipoEstablecimiento().getIdTipoEstablecimiento());
		initFormEst.setModalidad(establecimiento.getModalidad().getIdModalidad());

		preparePestanas(model, tipoEstablecimiento);

		model.addAttribute("filter", establecimiento);

		if (Constantes.AGENCIA_VIAJE.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosA", "model", model);
		} else if (Constantes.CAMPING.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosP", "model", model);
		} else if (Constantes.HOTEL.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosH", "model", model);
		} else if (Constantes.APARTAMENTO.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosT", "model", model);
		} else if (Constantes.ALBERGUE_TURISTICO.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosB", "model", model);
		} else if (Constantes.CASA_RURAL.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosX", "model", model);
		} else if (Constantes.AGROTURISMO.equals(tipoEstablecimiento)) {
			return new ModelAndView("datosEspecificosK", "model", model);
		}

		return new ModelAndView("datosEspecificos", "model", model);
	}

	/* PREPARE PESTANAS */

	private void preparePestanas(Model model, String tipoEstablecimiento) {
		model.addAttribute("nombreControlador", CONTROLADOR);
		model.addAttribute("currentPage", Constantes.PESTANA_DATOS_ESPECIFICOS);
		model.addAttribute("datosEstablecimiento", Constantes.PESTANA_DATOS_ESTABLECIMIENTO);
		model.addAttribute("interesados", Constantes.PESTANA_INTERESADOS);
		model.addAttribute("datosEspecificos", Constantes.PESTANA_DATOS_ESPECIFICOS);
		model.addAttribute("expRelacionados", Constantes.PESTANA_EXP_RELACIONADOS);
		List<String> configs = Constantes.getmapPestanasEstablecimiento().get(tipoEstablecimiento);
		for (Iterator<String> iterator = configs.iterator(); iterator.hasNext();) {
			String configOption = (String) iterator.next();
			model.addAttribute(configOption, configOption);
		}
	}

	/* ESTRUCTURA */

	/**
	 * Gestion de la tabla
	 * 
	 * @param filterAb6341t00
	 * @param jqGridRequestDto
	 * @param idEstablecimiento
	 * @return
	 */
	@RequestMapping(value = "/estructurasHabVivienda/{idEstablecimiento}/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<HabitacionVivienda> filterTablaEstructuraHabVivienda(
			@RequestJsonBody(param = "filter") HabitacionVivienda filterAb6341t00,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto,
			@PathVariable("idEstablecimiento") Integer idEstablecimiento) {

		DatosEspecificosController.logger.info("[POST - filterTablaEstructuraHabVivienda] :");
		EstablecimientoData establecimientoData = new EstablecimientoData();
		establecimientoData.setIdEstablecimiento(idEstablecimiento);
		filterAb6341t00.setEstablecimientoData(establecimientoData);
		return this.habitacionViviendaService.filter(filterAb6341t00, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/estructurasHabVivienda/{idEstablecimiento}", method = RequestMethod.PUT)
	public @ResponseBody HabitacionVivienda editEstructuraHabVivienda(@PathVariable Integer idEstablecimiento,
			@RequestBody HabitacionVivienda filter) {
		EstablecimientoData establecimientoData = new EstablecimientoData();
		establecimientoData.setIdEstablecimiento(idEstablecimiento);
		filter.setEstablecimientoData(establecimientoData);
		HabitacionVivienda filterAux = this.habitacionViviendaService.update(filter);
		DatosEspecificosController.logger.info("[PUT] : Ab6339s00 actualizado correctamente");
		return filterAux;
	}

	@RequestMapping(value = "/estructurasHabVivienda/{idEstablecimiento}", method = RequestMethod.POST)
	public @ResponseBody HabitacionVivienda addEstructuraHabVivienda(@PathVariable Integer idEstablecimiento,
			@RequestBody HabitacionVivienda filter) {
		EstablecimientoData establecimientoData = new EstablecimientoData();
		establecimientoData.setIdEstablecimiento(idEstablecimiento);
		filter.setEstablecimientoData(establecimientoData);
		HabitacionVivienda filterAux = this.habitacionViviendaService.add(filter);
		DatosEspecificosController.logger.info("[POST] : Ab6339s00 actualizado correctamente");
		return filterAux;
	}

	@RequestMapping(value = "/estructurasHabVivienda/{idEstablecimiento}/{idHabVivienda}", method = RequestMethod.GET)
	public @ResponseBody HabitacionVivienda getEstructuraHabVivienda(
			@PathVariable("idEstablecimiento") Integer idEstablecimiento, @PathVariable String idHabVivienda) {
		DatosEspecificosController.logger.info("[POST - getOtraDependencia] : Obtener Ab6339s00s");

		HabitacionVivienda habitacionVivienda = new HabitacionVivienda();
		habitacionVivienda.setIdHabVivienda(idHabVivienda);

		return this.habitacionViviendaService.find(habitacionVivienda);
	}

	@RequestMapping(value = "/estructurasHabVivienda/{idEstablecimiento}/{idHabVivienda}", method = RequestMethod.DELETE)
	public @ResponseBody HabitacionVivienda deleteEstructuraHabVivienda(
			@PathVariable("idEstablecimiento") Integer idEstablecimiento, @PathVariable String idHabVivienda) {
		DatosEspecificosController.logger.info("[POST - delete] : Obtener Ab6339s00s");

		HabitacionVivienda habitacionVivienda = new HabitacionVivienda();
		habitacionVivienda.setIdHabVivienda(idHabVivienda);

		this.habitacionViviendaService.remove(habitacionVivienda);
		return habitacionVivienda;
	}

	/* OTRAS DEPENDENCIAS */

	@RequestMapping(value = "/otrasDependencias/{idEstablecimiento}/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<OtrasDependenciasVivienda> filterTablaOtrasDependencias(
			@RequestJsonBody(param = "filter") OtrasDependenciasVivienda filterAb6102t00,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto,
			@PathVariable("idEstablecimiento") Integer idEstablecimiento) {

		DatosEspecificosController.logger.info("[POST - filterTablaOtrasDependencias] :");
		EstablecimientoData establecimientoData = new EstablecimientoData();
		establecimientoData.setIdEstablecimiento(idEstablecimiento);
		filterAb6102t00.setEstablecimientoData(establecimientoData);
		return this.otrasDependenciasViviendaService.filter(filterAb6102t00, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/otrasDependencias/{idEstablecimiento}", method = RequestMethod.PUT)
	public @ResponseBody OtrasDependenciasVivienda editOtrasDependenciasVivienda(
			@PathVariable Integer idEstablecimiento, @RequestBody OtrasDependenciasVivienda filter) {
		EstablecimientoData establecimientoData = new EstablecimientoData();
		establecimientoData.setIdEstablecimiento(idEstablecimiento);
		filter.setEstablecimientoData(establecimientoData);
		OtrasDependenciasVivienda filterAux = this.otrasDependenciasViviendaService.update(filter);
		DatosEspecificosController.logger.info("[PUT] : Ab6339s00 actualizado correctamente");
		return filterAux;
	}

	@RequestMapping(value = "/otrasDependencias/{idEstablecimiento}", method = RequestMethod.POST)
	public @ResponseBody OtrasDependenciasVivienda addOtrasDependenciasVivienda(@PathVariable Integer idEstablecimiento,
			@RequestBody OtrasDependenciasVivienda filter) {
		EstablecimientoData establecimientoData = new EstablecimientoData();
		establecimientoData.setIdEstablecimiento(idEstablecimiento);
		filter.setEstablecimientoData(establecimientoData);
		OtrasDependenciasVivienda filterAux = this.otrasDependenciasViviendaService.add(filter);
		DatosEspecificosController.logger.info("[POST] : Ab6339s00 actualizado correctamente");
		return filterAux;
	}

	@RequestMapping(value = "/otrasDependencias/{idEstablecimiento}/{idOtrasdepViviendas}", method = RequestMethod.GET)
	public @ResponseBody OtrasDependenciasVivienda getOtraDependencia(
			@PathVariable("idEstablecimiento") Integer idEstablecimiento, @PathVariable String idOtrasdepViviendas) {
		DatosEspecificosController.logger.info("[POST - getOtraDependencia] : Obtener Ab6339s00s");

		OtrasDependenciasVivienda otrasDependenciasVivienda = new OtrasDependenciasVivienda();
		otrasDependenciasVivienda.setIdOtrasdepViviendas(idOtrasdepViviendas);

		return this.otrasDependenciasViviendaService.find(otrasDependenciasVivienda);
	}

	@RequestMapping(value = "/otrasDependencias/{idEstablecimiento}/{idOtrasdepViviendas}", method = RequestMethod.DELETE)
	public @ResponseBody OtrasDependenciasVivienda deleteOtraDependencia(
			@PathVariable("idEstablecimiento") Integer idEstablecimiento, @PathVariable String idOtrasdepViviendas) {
		DatosEspecificosController.logger.info("[POST - delete] : Obtener Ab6339s00s");

		OtrasDependenciasVivienda otrasDependenciasVivienda = new OtrasDependenciasVivienda();
		otrasDependenciasVivienda.setIdOtrasdepViviendas(idOtrasdepViviendas);

		this.otrasDependenciasViviendaService.remove(otrasDependenciasVivienda);
		return otrasDependenciasVivienda;
	}

	@RequestMapping(value = "/estByOfiPpal/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<Establecimiento> filter(
			@RequestJsonBody(param = "filter") Establecimiento filterAb6337s00,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto) {
		DatosEspecificosController.logger.info("[POST - filter] : Obtener Ab6337s00s");
		return this.establecimientoService.findEstablecimientoByOfiPpal(filterAb6337s00, jqGridRequestDto, false,
				false);
	}

	@RequestMapping(value = "/searchEstablecimiento", method = RequestMethod.GET)
	public @ResponseBody List<Establecimiento> searchEstablecimiento(
			@RequestParam(value = "q", required = true) String q,
			@RequestParam(value = "c", required = true) Boolean c) {
		Establecimiento establecimiento = new Establecimiento();
		establecimiento.setAutocompleteEstablecimiento(q);
		establecimiento.setTipoRegistro(Constantes.TIPO_REGISTRO_DEFINITIVO);
		// establecimiento.setMostrar(Constantes.ACTIVOS);
		return this.establecimientoService.findAllLike(establecimiento, null, false);
	}

	@RequestMapping(value = "/comprobarResumenDetalle/{filterId}/{tipoUnidadAlojativa}", method = RequestMethod.POST)
	public @ResponseBody ResultAjaxOperation comprobarResumenDetalle(@PathVariable("filterId") Integer filterId,
			@PathVariable("tipoUnidadAlojativa") Integer tipoUnidadAlojativa,
			@RequestParam(value = "filterTiposAloj", required = false) List<String> filterTiposAloj) {

		DatosEspecificosController.logger.info("comprobarResumenDetalle");
		Map<String, String> resultado;

		try {

			resultado = this.establecimientoDataService.comprobarResumenDetalle(filterId, tipoUnidadAlojativa,
					filterTiposAloj);

		} catch (Exception e) {

			DatosEspecificosController.logger.info("comprobarResumenDetalle " + e.getMessage());

			return new ErrorResultAjaxOperation("errorAjaxOperation_resumenDetalle");

		}

		String mensaje = "";

		if (tipoUnidadAlojativa == 6) {
			mensaje = "diferenciasResumenDetalleAseos";
		} else {
			mensaje = "diferenciasResumenDetalle";
		}

		SuccessResultAjaxOperation successResultAjaxOperation = new SuccessResultAjaxOperation(mensaje);

		successResultAjaxOperation.setData(resultado);

		return successResultAjaxOperation;
	}

}
