package com.ejie.ab61.control.moduloAdministrativo;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.model.moduloAdministrativo.HuecosFolderNumber;
import com.ejie.ab61.model.moduloAdministrativo.ModuloAdministracion;
import com.ejie.ab61.model.moduloAdministrativo.Trazas;
import com.ejie.ab61.model.usuario.Usuario;
import com.ejie.ab61.service.moduloAdministrativo.ModuloAdministracionService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;

/**
 * ModuloAdministrativoController
 * 
 *  
 */

@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "/mantenimientoModuloAdministrativo")
public class ModuloAdministracionController {

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

	@Autowired
	private ModuloAdministracionService moduloAdministracionService;

	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model, Usuario usuario) {
		ModuloAdministracionController.logger.info("[GET - View] : Mantenimiento Modulo Administrativo");
		model.addAttribute("mantenimientoModuloAdministrativo", new ModuloAdministracion());
		model.addAttribute("origen", Constantes.origen.GESTION_MODULO_ADMINISTRACION);
		return "mantenimientoModuloAdministrativo";
	}

	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<ModuloAdministracion> filter(
			@RequestJsonBody(param = "filter") ModuloAdministracion filterModuloAdministrativo,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto) {
		ModuloAdministracionController.logger.info("[POST - filter] : Obtener Mensajes");
		return this.moduloAdministracionService.filter(filterModuloAdministrativo, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/trazasMensaje/{idMensaje}/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<ModuloAdministracion> filterTrazasMensajes(
			@RequestJsonBody(param = "filter") ModuloAdministracion filterTrazas,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto, @PathVariable Integer idMensaje) {
		ModuloAdministracionController.logger.info("[POST - filter] : Obtener Trazas");
		Trazas trazas = new Trazas();
		trazas.setIdMensaje(idMensaje);
		filterTrazas.setTrazas(trazas);
		return this.moduloAdministracionService.filterTrazasMensajes(filterTrazas, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/trazasSolicitudes/{idMensaje}/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<ModuloAdministracion> filterTrazasSolicitudes(
			@RequestJsonBody(param = "filter") ModuloAdministracion filterTrazas,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto, @PathVariable Integer idMensaje) {
		ModuloAdministracionController.logger.info("[POST - filter] : Obtener Trazas");
		Trazas trazas = new Trazas();
		trazas.setIdMensaje(idMensaje);
		filterTrazas.setTrazas(trazas);

		return this.moduloAdministracionService.filterTrazasSolicitudes(filterTrazas, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/abrirMensaje/{id}", method = RequestMethod.GET)
	public String abrirMensaje(Model model, @PathVariable String id) {
		ModuloAdministracionController.logger.info("[GET - View] : Abrir Mensaje");
		String[] parts = id.split("_");
		String idMensaje = parts[1];
		String mensaje = this.moduloAdministracionService.obtenerMensaje(idMensaje);
		String mensajeAux = mensaje;

		model.addAttribute("idModificarMensaje", idMensaje);

		try {

			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
			// initialize StreamResult with File object to save to file
			StreamResult result = new StreamResult(new StringWriter());
			DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			Document doc = db.parse(new InputSource(new StringReader(mensaje)));
			DOMSource source = new DOMSource(doc);
			transformer.transform(source, result);
			mensaje = result.getWriter().toString();

			mensaje = mensaje.substring(39);

			model.addAttribute("mensaje", mensaje);

		} catch (Exception e) {
			model.addAttribute("mensaje", mensajeAux);
		}

		return "mensaje";
	}

	@RequestMapping(value = "/abrirSolicitud/{id}", method = RequestMethod.GET)
	public String abrirSolicitud(Model model, @PathVariable String id) {
		ModuloAdministracionController.logger.info("[GET - View] : Abrir Solicitud");
		String[] parts = id.split("_");
		String idMensaje = parts[1];
		String solicitud = this.moduloAdministracionService.obtenerSolicitud(idMensaje);
		String solicitudAux = solicitud;

		model.addAttribute("idModificarSolicitud", idMensaje);

		try {

			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
			// initialize StreamResult with File object to save to file
			StreamResult result = new StreamResult(new StringWriter());
			DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			Document doc = db.parse(new InputSource(new StringReader(solicitud)));
			DOMSource source = new DOMSource(doc);
			transformer.transform(source, result);
			solicitud = result.getWriter().toString();

			solicitud = solicitud.substring(39);

			model.addAttribute("solicitud", solicitud);

		} catch (Exception e) {
			model.addAttribute("solicitud", solicitudAux);
		}

		return "solicitud";
	}

	@RequestMapping(value = "/abrirTrazas/{id}", method = RequestMethod.GET)
	public String abrirTrazas(Model model, @PathVariable String id) {
		ModuloAdministracionController.logger.info("[GET - View] : Abrir Trazas");
		String[] parts = id.split("_");
		String idMensaje = parts[1];
		Integer configuracion = this.moduloAdministracionService.obtenerConfiguracion(idMensaje);
		model.addAttribute("tblTrazasMensajesCommand", new ModuloAdministracion());
		model.addAttribute("idMensaje", idMensaje);
		model.addAttribute("configuracion", configuracion);

		return "trazas";
	}

	@RequestMapping(value = "/guardarMensajeLimpiado/{id}", method = RequestMethod.POST)
	public @ResponseBody String guardarMensajeLimpiado(@PathVariable Integer id,
			@RequestParam("textoLimpiado") String textoLimpiado, Usuario usuario) {
		ModuloAdministracionController.logger.info("[GET - View] : Guardar Mensaje");
		this.moduloAdministracionService.guardarTextoMensajeLimpiado(id, textoLimpiado, usuario);
		return textoLimpiado;
	}

	@RequestMapping(value = "/guardarSolicitudLimpiado/{id}", method = RequestMethod.POST)
	public @ResponseBody String guardarSolicitudLimpiado(@PathVariable Integer id,
			@RequestParam("textoLimpiado") String textoLimpiado, Usuario usuario) {
		ModuloAdministracionController.logger.info("[GET - View] : Guardar Solicitud");
		this.moduloAdministracionService.guardarTextoSolicitudLimpiado(id, textoLimpiado, usuario);
		return textoLimpiado;
	}

	@RequestMapping(value = "/abrirTarea/{id}", method = RequestMethod.GET)
	public String abrirTarea(Model model, @PathVariable String id) {
		ModuloAdministracionController.logger.info("[GET - View] : Abrir Tarea");
		String[] parts = id.split("_");
		String idTarea = parts[1];
		String tareaMensaje = this.moduloAdministracionService.obtenerTarea(idTarea);
		model.addAttribute("tareaMensaje", tareaMensaje);
		return "trazasMensaje";
	}

	@RequestMapping(value = "/corregirMensaje", method = RequestMethod.POST)
	public @ResponseBody String corregirMensaje(@RequestBody ModuloAdministracion mensaje) {
		ModuloAdministracionController.logger.info("[GET - View] : Corregir Mensaje");

		ModuloAdministracion filterModuloAdministrativo = new ModuloAdministracion();
		filterModuloAdministrativo.setIdMensaje(mensaje.getIdMensaje());
		JQGridRequestDto jqGridRequestDto = new JQGridRequestDto();
		JQGridResponseDto<ModuloAdministracion> listaModulos = this.moduloAdministracionService
				.filter(filterModuloAdministrativo, jqGridRequestDto, false);

		filterModuloAdministrativo = (ModuloAdministracion) listaModulos.getRows().get(0);

		this.moduloAdministracionService.corregirMensaje(filterModuloAdministrativo);
		return "";
	}

	@RequestMapping(value = "/abrirCargarExpediente", method = RequestMethod.GET)
	public String abrirCargarExpediente() {
		ModuloAdministracionController.logger.info("[GET - View] : Abrir Cargar Expediente");
		return "cargarExpediente";
	}

	@RequestMapping(value = "/cargarExpediente/{cargaFolderId}/{procedimientos}", method = RequestMethod.POST)
	public @ResponseBody String cargarExpediente(@PathVariable String cargaFolderId,
			@PathVariable String procedimientos) {
		ModuloAdministracionController.logger.info("[GET - View] : Abrir Cargar Expediente");

		this.moduloAdministracionService.cargarExpediente(cargaFolderId, procedimientos);

		return "";
	}

	@RequestMapping(value = "/huecosFolderNumber/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<HuecosFolderNumber> huecosFolderNumber(
			@RequestJsonBody(param = "filter") HuecosFolderNumber filterHuecosFolderNumber,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto) {
		ModuloAdministracionController.logger.info("[GET - View] : Huecos FolderNumber");

		return this.moduloAdministracionService.huecosFolderNumber(filterHuecosFolderNumber, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/folderNull/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<HuecosFolderNumber> folderNull(
			@RequestJsonBody(param = "filter") HuecosFolderNumber filterHuecosFolderNumber,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto) {
		ModuloAdministracionController.logger.info("[GET - View] : Huecos FolderNumber");

		return this.moduloAdministracionService.folderNull(filterHuecosFolderNumber, jqGridRequestDto, false);
	}

	@RequestMapping(value = "/obtenerErroresFolderNumber", method = RequestMethod.POST)
	public @ResponseBody Boolean obtenerErroresFolderNumber() {
		ModuloAdministracionController.logger.info("[GET - View] : Obtener Errores Folder Number");

		Boolean retorno = this.moduloAdministracionService.llamadaPlObtenerErroresFolderNumber();

		return retorno;
	}

}
