package com.ejie.ab79.control.listados;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

import com.ejie.ab79.clientesWS.ab61WebService.Ab61Exception;
import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.comun.UtilsConfig;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.listados.Listados;
import com.ejie.ab79.model.plantillas.ParametrosConfig;
import com.ejie.ab79.model.procedimientos.Procedimientos;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.listados.ListadosService;
import com.ejie.ab79.service.plantillas.ParametrosConfigService;
import com.ejie.ab79.webservice.adaptadores.PIFAdaptador;

/**
 * 
 *  
 *
 */
@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/listados")

public class ListadosController {

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

	@Autowired
	private ListadosService listadosService;

	@Autowired
	private PIFAdaptador pifAdapterService;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	@Autowired
	private ExpedientesService expedientesService;

	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public ModelAndView mostrar(Model model, Usuario usuario) {

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

		if (parametrosConfig != null) {
			model.addAttribute("parametroPropuestaSancion", parametrosConfig.getValor());
		}

		ParametrosConfig parametrosConfigMovilidad = new ParametrosConfig();
		parametrosConfigMovilidad.setDescripcion(Constantes.CONFIGURACION_MOVILIDAD);
		parametrosConfigMovilidad = this.parametrosConfigService.find(parametrosConfigMovilidad);

		if (parametrosConfigMovilidad != null) {
			model.addAttribute("parametroMovilidad", parametrosConfigMovilidad.getValor());
		}

		return new ModelAndView("listados");
	}

	/**
	 * Metodo de presentacion del RUP_TABLE.
	 *
	 * @param model
	 *            Model
	 * @return String
	 */
	@RequestMapping(value = "/maint/{idInspeccion}", method = RequestMethod.GET)
	public ModelAndView mostrar(Model model, Usuario usuario, @PathVariable Integer idInspeccion) {

		Inspecciones inspeccion = new Inspecciones();
		inspeccion.setIdInspeccion(idInspeccion);
		Expedientes expedientes = new Expedientes();
		expedientes.setInspeccion(inspeccion);

		Expedientes expedientesAux = this.expedientesService.findByIdExpediente(expedientes);

		if (expedientesAux != null) {
			model.addAttribute("idProcedimiento", expedientesAux.getIdProcedimiento());

			String url = UtilsConfig.getAppProperties().getProperty("urlVerDocumento");
			url = url.replace("[folderID]", expedientesAux.getFolderId());
			model.addAttribute("urlVerDocumentos", url);
		}

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

		if (parametrosConfig != null) {
			model.addAttribute("parametroPropuestaSancion", parametrosConfig.getValor());
		}

		ParametrosConfig parametrosConfigMovilidad = new ParametrosConfig();
		parametrosConfigMovilidad.setDescripcion(Constantes.CONFIGURACION_MOVILIDAD);
		parametrosConfigMovilidad = this.parametrosConfigService.find(parametrosConfigMovilidad);

		if (parametrosConfigMovilidad != null) {
			model.addAttribute("parametroMovilidad", parametrosConfigMovilidad.getValor());
		}

		return new ModelAndView("listados");

	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 *
	 * @param filterListados
	 *            Listados Objeto que contiene los parametros de filtrado
	 *            utilizados en la busqueda.
	 * @return List<Listados> Lista de objetos correspondientes a la busqueda
	 *         realizada.
	 */
	@RequestMapping(value = "/getAllListadoProc/{idProcedimiento}", method = RequestMethod.GET)
	public @ResponseBody List<Listados> getAll(@PathVariable(value = "idProcedimiento") Integer idProcedimiento) {
		ListadosController.logger.info("[GET - find_ALL] : Obtener Listados por filtro");

		Procedimientos procedimiento = new Procedimientos();
		procedimiento.setIdProcedimiento(idProcedimiento);

		Listados listados = new Listados();
		listados.setProcedimientos(procedimiento);
		return this.listadosService.cargarCombo(listados);
	}

	/**
	 * 
	 * @param httpResponse
	 *            HttpServletResponse
	 * @param listados
	 *            Listados
	 * 
	 * @return String
	 * 
	 * @throws Exception
	 *             Exception
	 */
	@RequestMapping(value = "/llamarWebService/{idProcedimiento}", method = RequestMethod.POST)
	public @ResponseBody String get(HttpServletResponse httpResponse, @RequestBody() Listados listados,
			@PathVariable Integer idProcedimiento) throws Exception {

		return this.listadosService.gerenarXLS(listados, idProcedimiento);
	}

	/**
	 * 
	 * @param httpResponse
	 *            HttpServletResponse
	 * @param listado
	 *            Listados
	 * 
	 * @return String
	 * 
	 * @throws Exception
	 *             Exception
	 */
	@RequestMapping(value = "/descargar", method = RequestMethod.POST)
	public @ResponseBody String descargar(HttpServletResponse httpResponse, @ModelAttribute Listados listado)
			throws Exception {

		String rutaPIF = listado.getRutaPIF();
		BufferedInputStream contenidoXml = this.pifAdapterService.getFile(rutaPIF);
		int numRead;
		final int bufferSize = 1024;
		byte[] buffer = new byte[bufferSize];
		ByteArrayOutputStream outString = new ByteArrayOutputStream();
		try {
			while ((numRead = contenidoXml.read(buffer)) != -1) {
				outString.write(buffer, 0, numRead);
			}
		} finally {
			contenidoXml.close();
		}
		byte[] strbase64Doc1 = outString.toByteArray();

		String nombreDocumento = rutaPIF.substring(rutaPIF.indexOf("/"));
		httpResponse.setHeader("Content-Disposition", "attachment; filename=\"" + nombreDocumento + "\"");
		Cookie cookie = new Cookie("fileDownload", "true");
		cookie.setMaxAge(2);
		cookie.setPath("/");
		httpResponse.addCookie(cookie);
		httpResponse.setContentType("application/rtf");

		httpResponse.setContentLength(strbase64Doc1.length);
		httpResponse.getOutputStream().write(strbase64Doc1);

		httpResponse.getOutputStream().flush();
		httpResponse.getOutputStream().close();
		return null;
	}

	/**
	 * Captura las excepciones AB61Exception.
	 *
	 */
	@ExceptionHandler(value = { Ab61Exception.class })
	public void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex)
			throws Exception {

		String mensajeError = "";

		if (LocaleContextHolder.getLocale().getLanguage().equalsIgnoreCase(Constantes.CASTELLANO))
			mensajeError = ((Ab61Exception) ex).getFaultInfo().getMensajeCastellano();
		else
			mensajeError = ((Ab61Exception) ex).getFaultInfo().getMensajeEuskera();

		// stated Content-Length
		response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write(mensajeError);
		response.flushBuffer();
	}
}
