package com.atrium.etiquetas;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;



import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import com.atrium.hibernate.Tareas;
import com.atrium.hibernate.Usuarios;
import com.atrium.hibernate.modelo.IGestion_Usuario;
import com.atrium.spring.Acceso_ApplicationContext;

/**
 * Etiqueta personalizada para la generacion dinamica del menu personalizado de
 * cada usuario que inicia la aplicacion.
 * 
 * @author Roxana Ariza Sánchez.
 *
 */
public class Menu_Personalizado extends SimpleTagSupport 
	implements Comparator<Tareas>{

	// PROPIEDAD PARA RECOGER EL ATRIBUTO DE LA ETIQUETA
	private boolean sentido;

	// COLECCION PARA LAS OPCIONES DE MENU
	private List<Tareas> lista_tareas;
	
	private Usuarios usuario;

	@Override
	public void doTag() throws JspException, IOException {
		// RECOGEMOS EL USUARIO DE LA SESION
		usuario = (Usuarios) this.getJspContext().getAttribute("usuario",
				PageContext.SESSION_SCOPE);
		// EJECUCION DE PROCESO SOLO EN CASO DE QUE EXISTA EL USUARIO
		if (usuario != null) {
			// RECOGEMOS LA LISTA DE TAREAS DE LA SESSION SI ES QUE ESTA
			lista_tareas = (List<Tareas>) this
					.getJspContext().getAttribute("lista_tareas",
							PageContext.SESSION_SCOPE);
			// PROCESAMOS LA CONSULTA SOLO LA PRIMERA VEZ
			if (lista_tareas == null) {
				// PEDIMOS LAS TAREAS DEL USUARIO
				this.obtener_Tareas();
			}
			// LLAMAMOS A LA GENERACION DEL MENU
			this.generar_Menu();
		}
	}

	/**
	 * Proceso interno de creacion del HTML para el menu del usuario.
	 * 
	 * @throws IOException
	 *             Excepcion producida por el proceso de escritura en la pagina.
	 */
	private void generar_Menu() throws IOException {
		// GENERACION DEL HTML PARA LA PAGINA
		StringBuffer salida = new StringBuffer();
		String descripcion = "";
		// TRATO EL RESULTADO DE LA CONSULTA PARA CREAR EL HTML NECESARIO
		for (Tareas tarea : lista_tareas) {
			descripcion = tarea.getDescripcionTarea();
			// CREACION DE LOS HIPERVINCULOS DEL MENU
			salida.append("\n<tr><td><a href='jsp/inicio.jsp?tarea="
					+ tarea.getVinculo() + "'>" + descripcion
					+ "</a></td></tr>");
		}
		// ESCRIBO EL HTML EN LA PAGINA
		this.getJspContext().getOut().append(salida.toString());
	}

	
	/**
	 * Proceso dinamico de consulta a la base de datos para la obtenicion de las
	 * tareas de cada usuario.
	 */
	private void obtener_Tareas() {
		// CREAMOS POR PRIMERA VEZ LA COLECCION DE TAREAS
		lista_tareas = new ArrayList<Tareas>();
		// PIDO LA FACHADA AL APPLICATION CONTEXT DE SPRING
		IGestion_Usuario gestion_usuario = Acceso_ApplicationContext
				.getBean(IGestion_Usuario.class);
		// REALIZO LA CONSULTA QUE ME RESUELVE LA CARGA VAGA DE HIBERNATE
		lista_tareas = gestion_usuario
				.consultar_TareasUsuario(usuario);
		// ORDENAMOS LA COLECCION
		Collections.sort(lista_tareas, this);
		// CARGAMOS LA LISTA DE TAREAS PARA QUE EN UNA NUEVA PETICION NO SE
		// REPITA EL PROCESO
		this.getJspContext().setAttribute("lista_tareas",
				lista_tareas, PageContext.SESSION_SCOPE);
		
	}

	/**
	 * Proceso de ordenacion de los textos de la coleccion para ser mostrados en el menu.
	 */
	
	public int compare(Tareas tarea1, Tareas tarea2) {
		int comparacion = 0;
		if (new Boolean(isSentido())) {
			comparacion = tarea1.getDescripcionTarea().compareTo(
					tarea2.getDescripcionTarea());
		} else {
			comparacion = tarea2.getDescripcionTarea().compareTo(
					tarea1.getDescripcionTarea());
		}
		return comparacion;
	}

	// ACCESORES PARA EL ATRIBUTO DE LA PAGINA
	public boolean isSentido() {
		return sentido;
	}

	public void setSentido(boolean sentido) {
		this.sentido = sentido;
	}

}
