package com.ejie.m62fb.control.registroVPP;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

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.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
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 org.springframework.web.servlet.ModelAndView;

import com.ejie.m62fb.model.TitularesVivienda;
import com.ejie.m62fb.model.Vivienda;
import com.ejie.m62fb.service.registroVPP.TitularesViviendaService;
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;

/**
 * TitularesViviendaController.
 * 
XXXX
 */
@Controller
@RequestMapping(value = "/titularesVivienda")
public class TitularesViviendaController {

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

	@Autowired
	private TitularesViviendaService titularesViviendaService;

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

	/**
	 * Consulta si el titular esta en otro contrato de otra vivienda.
	 * 
	 * @param numVivienda
	 *            BigDecimal
	 * @param idPersona
	 *            BigDecimal
	 * @return boolean
	 */
	@RequestMapping(value = "/existenOtrosContratos/{numVivienda}/{idPersona}", method = RequestMethod.GET)
	public @ResponseBody
	boolean getTitularesContratos(@PathVariable BigDecimal numVivienda,
			@PathVariable BigDecimal idPersona) {
		return this.titularesViviendaService.existenOtrosContratos(numVivienda,
				idPersona);
	}

	/**
	 * Funcion encargada de realizar la exportacion a Excel
	 * 
	 * @param filterTitularesVivienda
	 *            TitularesVivienda
	 * @param columns
	 *            String
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param modelMap
	 *            ModelMap
	 * @param request
	 *            ModelMap
	 * @return ModelAndView
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/restoViviendas/xlsxReport", method = RequestMethod.POST)
	protected ModelAndView getExcelPOI(
			@ModelAttribute TitularesVivienda filterTitularesVivienda,
			@RequestParam(value = "columns", required = false) String columns,
			@ModelAttribute JQGridRequestDto jqGridRequestDto,
			ModelMap modelMap, HttpServletRequest request) {

		// Acceso a BD para recuperar datos
		jqGridRequestDto.setPage(null);
		jqGridRequestDto.setRows(null);
		List<Vivienda> listViviendaAll = (List<Vivienda>) this.titularesViviendaService
				.filterRestoViviendas(filterTitularesVivienda, jqGridRequestDto)
				.getRows();

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

		// Hoja 1
		ReportData<Vivienda> viviendaExcelDataAll = new ReportData<Vivienda>();
		// Nombre hoja
		viviendaExcelDataAll.setSheetName("Otros Contratos Titular");
		// Cabeceras hoja
		viviendaExcelDataAll.setHeaderNames(ReportData.parseColumns(columns));
		// Datos hoja
		viviendaExcelDataAll.setModelData(listViviendaAll);
		reportData.add(viviendaExcelDataAll);

		// Nombre fichero
		modelMap.put("fileName", "OtrosContratos");
		// Excel Data
		modelMap.put("reportData", reportData);

		// Generación del XLS o XLSX
		return new ModelAndView("xlsxReport", modelMap);
	}
}