package com.ejie.ab61.control.plantillas;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.model.plantillas.ParametrosConfig;
import com.ejie.ab61.model.usuario.Usuario;
import com.ejie.ab61.service.plantillas.ParametrosConfigService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;

/**
 * PlantillasController  
 * 
 *  
 */

@Controller
@RequestMapping(value = "/parametrosConfig")
@SessionAttributes("usuario")
public class ParametrosConfigController {

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

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	/*
	 * OPERACIONES CRUD (Create, Read, Update, Delete)
	 * 
	 */

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado
	 * 
	 * @param idParametroConfig
	 *            Integer
	 * @return ParametrosConfig Objeto correspondiente al identificador indicado
	 */
	@RequestMapping(value = "/{idParametroConfig}", method = RequestMethod.GET)
	public @ResponseBody ParametrosConfig get(@PathVariable Integer idParametroConfig) {
		ParametrosConfig parametrosConfig = new ParametrosConfig();
		parametrosConfig.setIdParametroConfig(idParametroConfig);
		parametrosConfig = this.parametrosConfigService.find(parametrosConfig);
		ParametrosConfigController.logger.info("[GET - findBy_PK] : Obtener ParametrosConfig por PK");
		return parametrosConfig;
	}

	/**
	 * Operacion CRUD Edit. Modificacion del Bean indicado.
	 * 
	 * @param parametrosConfig
	 *            ParametrosConfig Bean que contiene la informacion a modificar.
	 * @return ParametrosConfig Bean resultante de la modificacion.
	 */
	@RequestMapping(method = RequestMethod.PUT)
	public @ResponseBody ParametrosConfig edit(@RequestBody ParametrosConfig parametrosConfig, Usuario usuario) {

		Date fechaHoy = new Date();
		parametrosConfig.setFechaUltmodificacion(fechaHoy);
		parametrosConfig.setUsuarioUltmodificacion(usuario.getNombreUsuario());

		ParametrosConfig parametrosConfigAux = this.parametrosConfigService.update(parametrosConfig);
		ParametrosConfigController.logger.info("[PUT] : ParametrosConfig actualizado correctamente");
		return parametrosConfigAux;
	}

	/**
	 * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean
	 * indicado.
	 * 
	 * @param parametrosConfig
	 *            ParametrosConfig Bean que contiene la ionformacion con la que
	 *            se va a crear el nuevo registro.
	 * @return ParametrosConfig Bean resultante del proceso de creacion.
	 */
	@RequestMapping(method = RequestMethod.POST)
	public @ResponseBody ParametrosConfig add(@RequestBody ParametrosConfig parametrosConfig, Usuario usuario) {

		Date fechaHoy = new Date();
		parametrosConfig.setFechaRegistro(fechaHoy);
		parametrosConfig.setUsuarioRegistro(usuario.getNombreUsuario());

		ParametrosConfig parametrosConfigAux = this.parametrosConfigService.add(parametrosConfig);
		ParametrosConfigController.logger.info("[POST] : ParametrosConfig insertado correctamente");
		return parametrosConfigAux;
	}

	@RequestMapping(value = "/{idParametroConfig}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody ParametrosConfig remove(@PathVariable Integer idParametroConfig) {
		ParametrosConfig parametrosConfig = new ParametrosConfig();
		parametrosConfig.setIdParametroConfig(idParametroConfig);
		this.parametrosConfigService.remove(parametrosConfig);
		ParametrosConfigController.logger.info("[DELETE] : ParametrosConfig borrado correctamente");
		return parametrosConfig;
	}

	/*
	 * METODOS COMPENENTE RUP_TABLE
	 * 
	 *
	 *//**
		 * Metodo de presentacion del RUP_TABLE.
		 * 
		 * @param model
		 *            Model
		 * @return String
		 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model) {
		ParametrosConfigController.logger.info("[GET - View] : parametrosConfig");
		model.addAttribute("origen", Constantes.origen.PARAMETROS_CONFIG);
		return "parametrosConfig";
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterParametrosConfig
	 *            ParametrosConfig Bean que contiene los parametros de filtrado
	 *            a emplear.
	 * @param jqGridRequestDto
	 *            Dto que contiene los parametros de configuracion propios del
	 *            RUP_TABLE a aplicar en el filtrado.
	 * @return JQGridResponseDto<ParametrosConfig> Dto que contiene el resultado
	 *         del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<ParametrosConfig> filter(
			@RequestJsonBody(param = "filter") ParametrosConfig filterParametrosConfig,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto) {
		ParametrosConfigController.logger.info("[POST - filter] : Obtener ParametrosConfig");
		return this.parametrosConfigService.filter(filterParametrosConfig, jqGridRequestDto, false);
	}
}
