package ec.edu.epn.seguridad.VO;

import java.io.Serializable;
import java.util.Collections;

import java.util.List;
import java.util.ArrayList;
import javax.faces.component.UIInput;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlSelectOneListbox;
import javax.faces.component.html.HtmlSelectOneRadio;
import javax.naming.InitialContext;

import ec.edu.epn.seguridad.servicio.ServicioSeguridad;
import ec.edu.epn.seguridad.vo.Aplicacion;


public class GestionAplicaciones implements Serializable {

	private static final long serialVersionUID = 9099065821772808727L;

	private ServicioSeguridad ss;
	{
		try {
			InitialContext ctx = new InitialContext();
			ss = (ServicioSeguridad) ctx.lookup("java:global/ServiciosSeguridadEPN/ServicioSeguridadBean!ec.edu.epn.seguridad.servicio.ServicioSeguridad");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	private String nombre;
	private String descripcion;
	private String activo;	
	private String url;
	private List<Aplicacion> listaAplicaciones;
	private List<SelectItem> listaItems;
	
	//Estilos para los mensajes de Error
	private String style;
	private String styleSuccess="COLOR: #008000;";
	private String styleError="COLOR: #fc5868;";
	private String msgAdd;
	private String msgUp;
	
	//Componentes para cambiar din�micamente h:inputText
	private UIInput nombreIN;  
	private UIInput descripcionIN;
	private UIInput urlIN;
	private HtmlSelectOneRadio selectDefaultValue;
	
	//Componentes para cambiar din�micamente h:outputText
	private HtmlOutputText nombreOut;
	private HtmlOutputText descripcionOut;
	private HtmlOutputText urlOut;
	
	//Selecci�n de la aplicacion a modificar
	private Long aplicacionSeleccionadaID;
	private HtmlSelectOneListbox aplicacionListBox;
	

	public HtmlOutputText getNombreOut() {
		return nombreOut;
	}


	public void setNombreOut(HtmlOutputText nombreOut) {
		this.nombreOut = nombreOut;
	}


	public HtmlOutputText getDescripcionOut() {
		return descripcionOut;
	}


	public void setDescripcionOut(HtmlOutputText descripcionOut) {
		this.descripcionOut = descripcionOut;
	}


	public HtmlOutputText getUrlOut() {
		return urlOut;
	}


	public void setUrlOut(HtmlOutputText urlOut) {
		this.urlOut = urlOut;
	}


	public Long getAplicacionSeleccionadaID() {		
		return aplicacionSeleccionadaID;
	}


	public void setAplicacionSeleccionadaID(Long aplicacionSeleccionadaID) {		
		this.aplicacionSeleccionadaID = aplicacionSeleccionadaID;
	}


	public List<SelectItem> getListaItems(){
		listaAplicaciones = new ArrayList<Aplicacion>();
		getListaAplicaciones();

		Collections.sort(listaAplicaciones, new ComparatorAdmin());
		
		listaItems = new ArrayList<SelectItem>();
		for(Aplicacion app : listaAplicaciones){
			listaItems.add(new SelectItem(app.getId(), app.getNombre(), app.getDescripcion()));
		}
		
		return listaItems;
	}
	
	public List<Aplicacion> getListaAplicaciones() {
		listaAplicaciones = ss.consultarAplicaciones();
		Collections.sort(listaAplicaciones, new ComparatorAdmin());
		return listaAplicaciones;
	}



	public void setListaAplicaciones(List<Aplicacion> listaAplicaciones) {
		this.listaAplicaciones = listaAplicaciones;
	}


	public void setListaItems(List<SelectItem> listaItems) {
		this.listaItems = listaItems;
	}

	public UIInput getNombreIN() {
		return nombreIN;
	}

	public void setNombreIN(UIInput nombreIN) {
		this.nombreIN = nombreIN;
	}	

	public UIInput getDescripcionIN() {
		return descripcionIN;
	}

	public void setDescripcionIN(UIInput descripcionIN) {
		this.descripcionIN = descripcionIN;
	}

	public UIInput getUrlIN() {
		return urlIN;
	}

	public void setUrlIN(UIInput urlIN) {
		this.urlIN = urlIN;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String getActivo() {
		return activo;
	}

	public void setActivo(String activo) {
		this.activo = activo;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
	

	public HtmlSelectOneRadio getSelectDefaultValue() {
		return selectDefaultValue;
	}


	public void setSelectDefaultValue(HtmlSelectOneRadio selectDefaultValue) {
		this.selectDefaultValue = selectDefaultValue;
	}
	
	
	public HtmlSelectOneListbox getAplicacionListBox() {
		return aplicacionListBox;
	}


	public void setAplicacionListBox(HtmlSelectOneListbox aplicacionListBox) {
		this.aplicacionListBox = aplicacionListBox;
	}


	public void addAplicacion(ActionEvent event){		
		Aplicacion app = new Aplicacion();
		try{
			if(nombre.trim().equals("") || descripcion.trim().equals("") || activo.trim().equals("") || url.trim().equals("")){
				throw new Exception();
			}else{
				app.setNombre(nombre.trim());
				app.setDescripcion(descripcion.trim());
				app.setActivo(activo.trim());
				app.setUrl(url.trim());
				ss.guardarAplicacion(app);
				setStyle(getStyleSuccess());
				setMsgAdd("Aplicaci�n ingresada con �xito");
				setNombre("");
				setDescripcion("");
				setActivo("");
				setUrl("");
			}
		}catch(Exception e){
			setStyle(getStyleError());
			setMsgAdd("La operaci�n no fue completada");
		}
	}

	public void updateAplicacion(ActionEvent event){		
		String appSeleccionada = (String)aplicacionListBox.getValue();
		setAplicacionSeleccionadaID(Long.parseLong(appSeleccionada!=null ? appSeleccionada : "-1"));		
		
		try{
			Aplicacion app = searchAplicacion(aplicacionSeleccionadaID);			
			if(nombre.trim().equals("") || descripcion.trim().equals("") || activo.trim().equals("") || url.trim().equals("")){
				throw new Exception();
			}else{
				app.setNombre(nombre.trim());
				app.setDescripcion(descripcion.trim());
				app.setActivo(activo.trim());
				app.setUrl(url.trim());
				ss.actualizarAplicacion(app);
				setStyle(getStyleSuccess());
				setMsgUp("Aplicaci�n modificada con �xito");
				setNombre("");
				nombreOut.setValue("");
				setDescripcion("");
				descripcionOut.setValue("");
				setActivo("");
				setUrl("");
				urlOut.setValue("");
			}
		}catch(Exception e){
			setStyle(getStyleError());
			setMsgUp("La operaci�n no fue completada");
		}
		
	}


	public void cargarInfoAplicacion(ValueChangeEvent event){		
		setAplicacionSeleccionadaID(Long.parseLong((String)event.getNewValue()));		
		Aplicacion a = searchAplicacion(aplicacionSeleccionadaID);
		
		nombreOut.setValue("Actual: "+a.getNombre());
		descripcionOut.setValue("Actual: "+a.getDescripcion());
		urlOut.setValue("Actual: "+a.getUrl());	

		nombreIN.setValue(a.getNombre());  
		descripcionIN.setValue(a.getDescripcion());
		urlIN.setValue(a.getUrl());
		selectDefaultValue.setValue(a.getActivo());		
	}
	
		
	public Aplicacion searchAplicacion(Long id){
		for(Aplicacion a : listaAplicaciones ){
			if(a.getId()==id.longValue()){
				return a;
			}
		}
		return null;
	}
	
	public void cargarInicio(ActionEvent event){
		nombreIN.setValue(" ");  
		descripcionIN.setValue(" ");
		urlIN.setValue(" ");
		selectDefaultValue.setValue(" ");
		nombreOut.setValue(" ");
		descripcionOut.setValue(" ");
		urlOut.setValue(" ");
	}

	public void limpiarComponentes(ActionEvent event){

		setNombre(" ");
		setUrl(" ");
		setDescripcion(" ");
		setActivo(" ");
	}
	
	public void setStyleSuccess(String styleSuccess) {
		this.styleSuccess = styleSuccess;
	}


	public String getStyleSuccess() {
		return styleSuccess;
	}


	public void setStyleError(String styleError) {
		this.styleError = styleError;
	}


	public String getStyleError() {
		return styleError;
	}


	public void setStyle(String style) {
		this.style = style;
	}


	public String getStyle() {
		return style;
	}


	public void setMsgAdd(String msgAdd) {
		this.msgAdd = msgAdd;
	}


	public String getMsgAdd() {
		return msgAdd;
	}


	public void setMsgUp(String msgUp) {
		this.msgUp = msgUp;
	}


	public String getMsgUp() {
		return msgUp;
	}

}