package com.ejie.ab61.control.configuracionEventos;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
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.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.model.configuracionEventos.ConfigEventos;
import com.ejie.ab61.model.usuario.Usuario;
import com.ejie.ab61.service.configuracionEventos.ConfigEventosService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.reports.ReportData;

/**
 * ListadosController  
 * 
 *  
 */

@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "/configEventos")

public class ConfigEventosController {

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

	@Autowired
	private ConfigEventosService configEventosService;

	@Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

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

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

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 *
	 * @param filterConfigEventos
	 *            ConfigEventos Objeto que contiene los parametros de filtrado
	 *            utilizados en la busqueda.
	 * @return List<ConfigEventos> Lista de objetos correspondientes a la
	 *         busqueda realizada.
	 */
	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody List<ConfigEventos> getAll(@ModelAttribute ConfigEventos filterConfigEventos) {
		ConfigEventosController.logger.info("[GET - find_ALL] : Obtener ConfigEventos por filtro");
		return this.configEventosService.findAll(filterConfigEventos, null);
	}

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

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

		ConfigEventos configEventosAux = this.configEventosService.add(configEventos);
		ConfigEventosController.logger.info("[POST] : ConfigEventos insertado correctamente");
		return configEventosAux;
	}

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

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

		ConfigEventos configEventosAux = this.configEventosService.update(configEventos);
		ConfigEventosController.logger.info("[PUT] : ConfigEventos actualizado correctamente");
		return configEventosAux;

	}

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

	/**
	 * Operacion CRUD Delete. Borrado del registro correspondiente al
	 * identificador especificado.
	 *
	 * @param idConfigEventos
	 *            Integer Identificador del objeto que se desea eliminar.
	 * @return ConfigEventos Bean eliminado.
	 */
	@RequestMapping(value = "/{idConfigEventos}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody ConfigEventos remove(@PathVariable Integer idConfigEventos) {
		ConfigEventos configEventos = new ConfigEventos();
		configEventos.setIdConfigEventos(idConfigEventos);
		this.configEventosService.remove(configEventos);
		ConfigEventosController.logger.info("[DELETE] : ConfigEventos borrado correctamente");
		return configEventos;
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterConfigEventos
	 *            ConfigEventos 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<ConfigEventos> Dto que contiene el resultado
	 *         del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<ConfigEventos> filter(
			@RequestJsonBody(param = "filter") ConfigEventos filterConfigEventos,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto) {
		ConfigEventosController.logger.info("[POST - filter] : Obtener ConfigEventos");
		return this.configEventosService.filter(filterConfigEventos, jqGridRequestDto, false);
	}

	@RequestMapping(value = { "/xlsReport", "/xlsxReport" }, method = RequestMethod.GET)
	public ModelAndView getExcelPOI(@ModelAttribute ConfigEventos filterConfigEventos,
			@ModelAttribute JQGridRequestDto jqGridRequestDto, ModelMap modelMap,
			@RequestParam(value = "columns", required = false) String columns, HttpServletRequest request) {

		Locale locale = LocaleContextHolder.getLocale();

		// Acceso a BD para recuperar datos

		columns = "[['descripcion','" + appMessageSource.getMessage("configEventosExcel.descripcion", null, locale)
				+ "']" + ",['tipoEvento','" + appMessageSource.getMessage("configEventosExcel.tipoEvento", null, locale)
				+ "']" + ",['plateaType','" + appMessageSource.getMessage("configEventosExcel.plateaType", null, locale)
				+ "']" + ",['plateaSubtype','"
				+ appMessageSource.getMessage("configEventosExcel.plateaSubtype", null, locale) + "']"
				+ ",['configuracion','" + appMessageSource.getMessage("configEventosExcel.configuracion", null, locale)
				+ "']" + ",['instanceId','" + appMessageSource.getMessage("configEventosExcel.instanceId", null, locale)
				+ "']" + "]";

		jqGridRequestDto.setPage(null);
		jqGridRequestDto.setRows(null);
		List<ConfigEventos> listProgramasAll = this.configEventosService.findAllLike(filterConfigEventos,
				jqGridRequestDto, null);

		// Nombre fichero
		modelMap.put("fileName", appMessageSource.getMessage("configEventosExcel", null, locale));

		// Datos
		List<Object> reportData = new ArrayList<Object>();

		// Hoja 1
		ReportData<ConfigEventos> usuarioExcelDataAll = new ReportData<ConfigEventos>();

		// nombre hoja
		usuarioExcelDataAll.setSheetName(appMessageSource.getMessage("configEventosExcel", null, locale));

		// cabeceras hoja
		usuarioExcelDataAll.setHeaderNames(ReportData.parseColumns(columns));

		// datos hoja
		if (listProgramasAll.size() <= 0) {

			listProgramasAll.add(new ConfigEventos());

		}
		usuarioExcelDataAll.setModelData(listProgramasAll);
		reportData.add(usuarioExcelDataAll);

		modelMap.put("reportData", reportData);

		// Generación del XLS o XLSX
		if (request.getServletPath().indexOf("xlsReport") != -1) {
			return new ModelAndView("xlsReport", modelMap);
		} else {
			return new ModelAndView("xlsxReport", modelMap);
		}

	}

}
