package net.bersus.selene.spring.controller;

import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;

import java.beans.PropertyVetoException;

import javax.naming.NamingException;
import javax.validation.Valid;

import net.bersus.selene.interfaz.http.obj.LHObjeto;
import net.bersus.selene.spring.form.Objmd1idForm;
import net.bersus.selene.util.Conexion;
import net.bersus.selene.util.Modelo;
import net.bersus.selene.util.SeleneException;
import net.bersus.selene.util.SeleneKeys;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttribute;

@Controller
public class ObjetoController {
    // Instancia del logger
    private static final Logger logger = LoggerFactory.getLogger(ObjetoController.class);
    
    @Autowired
	private PlatformTransactionManager transactionManager;
    
	@RequestMapping(value="/OBJMD1ID", method = GET)
	public String objmd1id(
			Objmd1idForm objmd1idForm,
	   		@SessionAttribute(SeleneKeys.CTX_CONEXION) Conexion conexion,
			Model model) 
			throws SeleneException, PropertyVetoException, NamingException {
		logger.debug("Vista: OBJMD1ID. Modelo de entrada: " + model.asMap().toString());
		
        // Transformar el modelo de Spring al modelo Selene
		Modelo modelo = new Modelo(model.asMap());
		
        LHObjeto objmHome = new LHObjeto();
        String evento = SeleneKeys.EVT_OK;
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Leyendo tipos de objeto");
        	evento = objmHome.leerTiposDeObjeto(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Leyendo subtipos de objeto");
        	evento = objmHome.leerSubtiposDeObjetoCriterioSeleccion(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Leyendo tipos de indicador lista");
        	evento = objmHome.leerTiposDeIndicadorLista(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Limpiando criterio de seleccion");
        	evento = objmHome.limpiarCriterioSeleccion(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        } else {
        	return "util/mensaje";
        }
        
		logger.debug("Vista: OBJMD1ID. Modelo de salida: " + model.asMap().toString());
        logger.debug("Vista: seleccionaObjeto");
        return "seleccionaObjeto";
	}
	
	@RequestMapping(value="/seleccionaObjeto", method = GET)
	public String seleccionaobjmd1idForm(Objmd1idForm objmd1idForm) {
		logger.debug("Entrando en el controlador GET de seleccionarObjeto");
		return "seleccionaObjeto";
	}
    
	@RequestMapping(value="/seleccionaObjeto", method = POST)
	public String seleccionaObjetoSubmit(
			@ModelAttribute Objmd1idForm objmd1idForm, 
	   		@SessionAttribute(SeleneKeys.CTX_CONEXION) Conexion conexion,
	   		BindingResult bindingResult,
			Model model) 
			throws SeleneException, PropertyVetoException, NamingException {
		logger.debug("Vista: seleccionaObjeto. Modelo de entrada: " + model.asMap().toString());
        if (bindingResult.hasErrors()) {
            return "seleccionarObjeto";
        }
        
        // Anadir el formulario al dato del contexto correspondiente
        objmd1idForm.toModel(model);

        // Transformar el modelo de Spring al modelo Selene
		Modelo modelo = new Modelo(model.asMap());
		
        LHObjeto objmHome = new LHObjeto();
        String evento = SeleneKeys.EVT_OK;
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Seleccionando");
        	evento = objmHome.seleccionar(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        	
        	// Transformar el modelo de Spring al formulario
        	objmd1idForm.setModel(model);
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Leyendo padres de objeto");
        	evento = objmHome.leerPadresObjeto(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        	
        	// Transformar el modelo de Spring al formulario
        	objmd1idForm.setModel(model);
        } else if (evento.equalsIgnoreCase(SeleneKeys.EVT_LISTA_VACIA)) {
        	return "util/mensaje";
        } else if (evento.equalsIgnoreCase(SeleneKeys.EVT_LISTA)) {
            model.addAttribute(objmd1idForm);
    		logger.debug("Vista: seleccionaObjeto. Modelo de salida: " + model.asMap().toString());
            logger.debug("Vista: listaObjetos");
        	return "listaObjetos";
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            model.addAttribute(objmd1idForm);
    		logger.debug("Vista: seleccionaObjeto. Modelo de salida: " + model.asMap().toString());
            logger.debug("Vista: consultarObjeto");
        	return "consultarObjeto";
        } else {
        	return "util/mensaje";
        }
	}
	
	@RequestMapping(value="/listaObjetos", method = GET)
	public String listaObjetos(Model model) 
			throws PropertyVetoException {
		Objmd1idForm objmd1idForm = new Objmd1idForm();
		objmd1idForm.setModel(model);
        model.addAttribute(objmd1idForm);
        return "listaObjetos";
	}
	
	@RequestMapping(value="/listaObjetos", method = POST)
	public String listaObjetos(
			@ModelAttribute Objmd1idForm objmd1idForm,
	   		@SessionAttribute(SeleneKeys.CTX_CONEXION) Conexion conexion,
			BindingResult bindingResult, 
			Model model) 
			throws SeleneException, PropertyVetoException, NamingException {
		logger.debug("Vista: listaObjetos. Modelo de entrada: " + model.asMap().toString());
        if (bindingResult.hasErrors()) {
            return "listaObjetos";
        }
        
        // Anadir el formulario al dato del contexto correspondiente
        objmd1idForm.toModel(model);

        // Transformar el modelo de Spring al modelo Selene
		Modelo modelo = new Modelo(model.asMap());
		
        LHObjeto objmHome = new LHObjeto();
        String evento = SeleneKeys.EVT_OK;
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Incluyendo");
        	evento = objmHome.incluir(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        	
        	// Transformar el modelo de Spring al formulario
        	objmd1idForm.setModel(model);
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Leyendo padres de objeto");
        	evento = objmHome.leerPadresObjeto(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        	
        	// Transformar el modelo de Spring al formulario
        	objmd1idForm.setModel(model);
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            model.addAttribute(objmd1idForm);
    		logger.debug("Vista: listaObjetos. Modelo de salida: " + model.asMap().toString());
            logger.debug("Vista: consultarObjeto");
        	return "consultarObjeto";
        } else {
        	return "util/mensaje";
        }
	}
    
	@RequestMapping(value="/consultarObjeto", method = GET)
	public String consultarObjeto(Model model) throws PropertyVetoException {
		Objmd1idForm objmd1idForm = new Objmd1idForm();
		objmd1idForm.setModel(model);
        model.addAttribute(objmd1idForm);
        return "consultarObjeto";
    }
	
	@RequestMapping(value="/consultarObjeto", method = POST)
	public String consultarObjeto(
			@Valid Objmd1idForm objmd1idForm, 
	   		@SessionAttribute(SeleneKeys.CTX_CONEXION) Conexion conexion,
			BindingResult bindingResult, 
			Model model) 
			throws SeleneException, PropertyVetoException, NamingException {
		logger.debug("Vista: consultarObjeto. Modelo de entrada: " + model.asMap().toString());
        if (bindingResult.hasErrors()) {
            return "seleccionarObjeto";
        }
        
        // Anadir el formulario al dato del contexto correspondiente
        objmd1idForm.toModel(model);

        // Transformar el modelo de Spring al modelo Selene
		Modelo modelo = new Modelo(model.asMap());
		
        LHObjeto objmHome = new LHObjeto();
        String evento = SeleneKeys.EVT_OK;
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            logger.debug("Obteniendo documentacion");
        	evento = objmHome.obtenerDocumentacion(modelo, conexion);
        	
        	// Transformar el modelo de Selene al modelo Spring
        	model.addAllAttributes(modelo.getElementos());
        	
        	// Transformar el modelo de Spring al formulario
        	objmd1idForm.setModel(model);
        } else {
        	return "util/mensaje";
        }
        if (evento.equalsIgnoreCase(SeleneKeys.EVT_OK)) {
            model.addAttribute(objmd1idForm);
    		logger.debug("Vista: consultarObjeto. Modelo de salida: " + model.asMap().toString());
            logger.debug("Vista: consultarObjeto");
        	return "consultarObjeto";
        } else {
        	return "util/mensaje";
        }
	}
}
