package com.ejie.ab63.control;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

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.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.servlet.ModelAndView;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.comun.utilidades.config.Config;
import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.ExpedientesRelacionados;
import com.ejie.ab63.model.InfoExpedienteEstablecimiento;
import com.ejie.ab63.model.inicio.InitFormEst;
import com.ejie.ab63.model.plantillas.ParametrosConfig;
import com.ejie.ab63.service.EstablecimientoService;
import com.ejie.ab63.service.ExpedientesRelacionadosService;
import com.ejie.ab63.service.expedientes.ExpedientesService;
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;
import com.ejie.x38.reports.ReportData;

/**
 * Ab6339s00Controller  
 * 
 *  
 */

@Controller
@RequestMapping(value = "/expRelacionados")

public class ExpRelacionadosController {

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

	private final String CONTROLADOR = "expRelacionados";

	@Autowired
	private ExpedientesRelacionadosService ExpedientesRelacionadosService;
	@Autowired
	private EstablecimientoService establecimientoService;

	@Autowired
	private ExpedientesService expedientesService;

	@Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	/**
	 * Metodo de presentacion del RUP_TABLE.
	 * 
	 * @param model
	 *            Model
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.POST)
	public String getFormEdit(Model model, @ModelAttribute(value = "initFormEst") InitFormEst initFormEst) {
		ExpRelacionadosController.logger.info("getFormEdit");

		Establecimiento filter = new Establecimiento();

		Properties prop = Config.loadProperties(Constantes.COD_APPL_CONFIG);

		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");
		}
		
		filter.setIdEstablecimiento(Integer.parseInt(initFormEst.getIdEstablecimiento()));
		filter = this.establecimientoService.find(filter);

		initFormEst.setIdentificadorEstablecimiento(filter.getIdentificadorEstablecimiento());
		String tipoEstablecimiento = filter.getTipoEstablecimiento().getIdTipoEstablecimiento();

		model.addAttribute("urlTareasTramitagune", prop.getProperty("urlTareasTramitagune"));
		preparePestanas(model, tipoEstablecimiento);

		return "expRelacionados";
	}

	/* PREPARE PESTANAS */

	private void preparePestanas(Model model, String tipoEstablecimiento) {
		model.addAttribute("nombreControlador", CONTROLADOR);
		model.addAttribute("currentPage", Constantes.PESTANA_EXP_RELACIONADOS);
		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);
		}
	}

	@RequestMapping(value = "/{identificadorEstablecimiento}/{origen}/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<InfoExpedienteEstablecimiento> filterTablaExpRelacionados(
			@RequestJsonBody(param = "filter") InfoExpedienteEstablecimiento filterAb6102t00,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto,
			@PathVariable("identificadorEstablecimiento") String identificadorEstablecimiento,
			@PathVariable("origen") String origen) {

		ExpRelacionadosController.logger.info("[POST - filterTablaExpRelacionados] :");

		filterAb6102t00.setIdentificadorEstablecimiento(identificadorEstablecimiento);
		return this.expedientesService.findExpRelByIdentificadorEst(filterAb6102t00, jqGridRequestDto, origen);
	}

	@RequestMapping(value = { "/xlsReport/{identificadorEstablecimiento}/{origen}" }, method = RequestMethod.POST)
	protected ModelAndView getExcelExpRelacionados(
			@ModelAttribute InfoExpedienteEstablecimiento infoExpedienteEstablecimiento,
			@ModelAttribute JQGridRequestDto jqGridRequestDto, ModelMap modelMap,
			@RequestParam(value = "columns", required = false) String columns, HttpServletRequest request,
			@PathVariable("identificadorEstablecimiento") String identificadorEstablecimiento,
			@PathVariable("origen") String origen) {

		ExpRelacionadosController.logger.info("[POST - getExcelExpRelacionados] :");

		Locale locale = LocaleContextHolder.getLocale();

		String procedimiento = "";

		if ("es".equals(locale.getLanguage())) {

			procedimiento = "procedimientoDescCast";

		} else {
			procedimiento = "procedimientoDescEusk";
		}

		columns = "[['folderNumber','" + appMessageSource.getMessage("excel.expediente", null, locale) + "']"
				+ ",['titulo','" + appMessageSource.getMessage("excel.titulo", null, locale) + "']" + ",['estado','"
				+ appMessageSource.getMessage("excel.estado", null, locale) + "']" + ",['expFechaEntrada','"
				+ appMessageSource.getMessage("excel.expFechaEntrada", null, locale) + "']" + ",['" + procedimiento
				+ "','" + appMessageSource.getMessage("excel.procedimiento", null, locale) + "']"
				+ ",['inspeccion.identificadorInspeccion','"
				+ appMessageSource.getMessage("excel.inspeccion", null, locale) + "']" + "]";

		infoExpedienteEstablecimiento.setIdentificadorEstablecimiento(identificadorEstablecimiento);
		List<InfoExpedienteEstablecimiento> infoExpedienteEstablecimientos = (List<InfoExpedienteEstablecimiento>) expedientesService
				.findExpRelByIdentificadorEstExcel(infoExpedienteEstablecimiento, null, origen);
		// Nombre fichero
		if ("1".equals(origen)) {
			modelMap.put("fileName", identificadorEstablecimiento
					+ appMessageSource.getMessage("excel.expRelacionadosCenso", null, locale));
		} else {
			modelMap.put("fileName", identificadorEstablecimiento
					+ appMessageSource.getMessage("excel.expRelacionadosOtros", null, locale));
		}

		List<Object> reportData = new ArrayList<Object>();
		// Hoja 1
		ReportData<InfoExpedienteEstablecimiento> usuarioExcelDataAll = new ReportData<InfoExpedienteEstablecimiento>();
		// nombre hoja
		usuarioExcelDataAll.setSheetName(appMessageSource.getMessage("excel.expRelacionados", null, locale));
		// cabeceras hoja
		usuarioExcelDataAll.setHeaderNames(ReportData.parseColumns(columns));
		// datos hoja
		usuarioExcelDataAll.setModelData(infoExpedienteEstablecimientos);
		reportData.add(usuarioExcelDataAll);

		modelMap.put("reportData", reportData);

		return new ModelAndView("xlsxReport", modelMap);
		/*
		 * if (request.getServletPath().indexOf("xlsReport") != -1) { return new
		 * ModelAndView("xlsReport", modelMap); } else { return new
		 * ModelAndView("xlsxReport", modelMap); }
		 */

	}

	@RequestMapping(method = RequestMethod.POST)
	public @ResponseBody ExpedientesRelacionados add(@RequestBody ExpedientesRelacionados expedienteRelacionado) {

		ExpedientesRelacionados expedienteRelacionadoAux = this.ExpedientesRelacionadosService
				.add(expedienteRelacionado);
		ExpRelacionadosController.logger.info("[POST] : Expediente relacionado insertado correctamente");
		return expedienteRelacionadoAux;
	}
}
