package com.curiam.client.llamada;

import gwtupload.client.IUploader;
import gwtupload.client.SingleUploader;
import gwtupload.client.IFileInput.FileInputType;
import gwtupload.client.IUploadStatus.Status;

import java.util.ArrayList;

import com.curiam.client.Acceso;
import com.curiam.client.componentes.Utiles;
import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.ModelType;
import com.extjs.gxt.ui.client.data.XmlReader;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.StackPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;


//Esta clase contiene los elementos del dialogbox de imagenes
//es la parte cliente de la librería GwtUpload adaptada a nuestro caso
//que interactua con GrettingStartedServlet

public class GettingStarted {

	private Grid vp = new Grid(4,1);
	HorizontalPanel hp_imagen = new HorizontalPanel();
	ScrollPanel sp = new ScrollPanel();
    HorizontalPanel scrolls = new HorizontalPanel();
    ArrayList<String> usuario = new ArrayList<String>();
    StackPanel stp;
    
public GettingStarted(final DialogBox db,String ruta, final StackPanel panel) {
	stp = panel;
	
	db.setPixelSize(300, 300);
	db.add(vp);
	
	final String[] userxml = ruta.split("/");
	usuario.add(userxml[1]);
	
	//Define el cargador de ficheros 
	SingleUploader defaultUploader = new SingleUploader(FileInputType.ANCHOR);
	defaultUploader.setEnabled(true);
   
    defaultUploader.addOnFinishUploadHandler(onFinishUploaderHandler);
	sp.setPixelSize(338, 150);
   
    
	//panel con las imagenes en miniatura
    final Acceso ac = new Acceso();
    ac.leer_imagenes_xml(usuario.get(0),hp_imagen, panel);
    
    sp.add(hp_imagen);
    
    final VerticalPanel tb_op = new VerticalPanel();
    ac.leer_analisis_xml(ruta,tb_op);
    
    
    
    //Gestionamos la vinculación de imagenes a casos médicos
    
    Button b_vincular = new Button("<font size=2>Vincular</font>",
	        new ClickHandler() {
	          public void onClick(ClickEvent event) {
	        	 				
				String r = new String(""); 
				ArrayList<Integer> q = new ArrayList<Integer>();
				
				//leer imagen seleccionada
				for(int i=0;i<hp_imagen.getWidgetCount();i++){
					
						String html = hp_imagen.getWidget(i).getElement().getChild(1).getChild(0).getChild(0).getChild(0).getChild(1).getChild(0).getChild(0).getChild(0).getChild(0).toString();
						String[] vector = html.split(" ");
										
						if(vector[3].equals("CHECKED")){
							
							String img1 = hp_imagen.getWidget(i).getElement().getChild(1).getChild(1).getChild(0).getChild(0).toString();
							
							String[] img2 = img1.split("/");
							String[] nom_img = img2[2].split("\" ");
							r = nom_img[0];
							
						}
				}
							
				//leer casos de uso seleccionados		
				int c=0;
				for(int i=0;i<tb_op.getWidgetCount();i++){
					String[] vector2 = tb_op.getWidget(i).getElement().getChild(0).toString().split(" ");
					if(vector2[3].equals("CHECKED")){
						String[] nom = tb_op.getWidget(i).getElement().getChild(1).toString().split(" ");
						String[] subvector = nom[2].split("<");
									
						q.add(Integer.parseInt(subvector[0]));
						c++;
					}
				}
								
				if(r.length()==0 || q.size()==0){
					Utiles.msj("Error", "Debe de seleccionar una imagen y al menos un caso.");
					return;
				}
			
				//acceder al StackPanel y mostrar la imagen seleccionada en los casos elegidos
				Grid t_ext1 = null;
				Grid t_ext2 = null;
				for(int i=0;i<q.size();i++){
					
					t_ext1 = (Grid) panel.getWidget(q.get(i)-1);
					t_ext2 = (Grid) t_ext1.getWidget(0, 1);
					Image im = new Image();
					
					im.setUrl("config/"+usuario.get(0)+"/"+r);
					im.setPixelSize(250, 250);
					t_ext2.setWidget(0,1,im);
				}
				
				ac.actualizar_referencias("config/"+userxml[1]+"/ref.xml",r,q);
			} 	
	});
    
    //salir
    Button b_cerrar = new Button("<font size=2>Cerrar</font>",
	        new ClickHandler() {
	          public void onClick(ClickEvent event) {
	            db.hide();
	          }
	});
    
    
    //añadir los componentes visuales al dialogbox
    Grid panel_horiz_op = new Grid(1,2);
    
    ScrollPanel sp_op = new ScrollPanel();
    sp_op.setPixelSize(120, 150);
    sp_op.setWidget(tb_op);
    
    panel_horiz_op.setCellSpacing(5);
    panel_horiz_op.setWidget(0, 0, b_vincular);
    panel_horiz_op.setWidget(0, 1, b_cerrar);
    
    
    CellFormatter cellFormatter = vp.getCellFormatter();
    cellFormatter.setHorizontalAlignment(3, 0, HasHorizontalAlignment.ALIGN_CENTER);

	scrolls.setSpacing(20);
	scrolls.add(sp);
	scrolls.add(sp_op);
    
	vp.setWidget(0, 0, new HTML("&nbsp;"));
	vp.setWidget(1, 0, defaultUploader);
	vp.setWidget(2, 0, scrolls);
	vp.setWidget(3, 0, panel_horiz_op);
	
}


 //carga la imagen en el servidor (GettingStartedServlet) y en caso de exito nos la muestra en miniatura

  private IUploader.OnFinishUploaderHandler onFinishUploaderHandler = new IUploader.OnFinishUploaderHandler() {
    public void onFinish(IUploader uploader) {
      if (uploader.getStatus() == Status.SUCCESS) {
   
     
        String imagen_ = uploader.getFileName();
        final String imagen = imagen_.substring(imagen_.lastIndexOf("\\")+1);
       
        
        GreetingServiceAsync acc2 = GWT.create(GreetingService.class);
		acc2.ubicarfichero("img/"+imagen, imagen, usuario.get(0), new AsyncCallback<Boolean>() {

			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				Utiles.msj("Error", "El servidor no responde.");
			}

			@Override
			public void onSuccess(Boolean result) {
				// TODO Auto-generated method stub
				
			if(result){
		

        //escribe su ruta 
        final String fichero = "config/" + usuario.get(0) + "/img.xml";
        GreetingServiceAsync acc = GWT.create(GreetingService.class);
		acc.leerFichero(fichero, new AsyncCallback<String>() {

			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				Utiles.msj("Error", "El servidor no responde.");
			}

			@Override
			public void onSuccess(String result) {
				// TODO Auto-generated method stub
				if (result == null)
					Utiles.msj("Error", "No se ha cargado el archivo xml1");
				else {
					ArrayList<String> imagenes = new ArrayList<String>();
					ArrayList<Integer> id = new ArrayList<Integer>();
					
					ModelType type = new ModelType();
					type.setRoot("files");
					type.setRecordName("file");
					type.addField("ruta");
					type.addField("id");
					
					
					int cont=0;
					if(!result.equals("")){
						XmlReader reader = new XmlReader(type);
						ArrayList arr = (ArrayList)reader.read(null, result);
					
						cont = arr.size();
						BaseModelData data; //= (BaseModelData)arr.get(0);
						
						for(int i=0; i<cont; i++){
							data = (BaseModelData)arr.get(i);
							imagenes.add((String)data.get("ruta"));
							id.add(Integer.parseInt((String)data.get("id")));
						}
					}
					String datos = new String("");
					datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
		    		datos += "<!-- Configuracion de imagenes -->\n";
		    		datos += "<files>\n";
		    		
		    		for(int j=0;j<cont;j++){
		    			if(imagenes.get(j).equals(imagen)){
		    				Utiles.msj("Error", "La imagen ya est&aacute; en el servidor");
		    				return;
		    			}
		    			datos += "\t<file>\n";
		    			datos += "\t\t<ruta>" + imagenes.get(j) + "</ruta>\n";
		    			datos += "\t\t<id>" + id.get(j) + "</id>\n";
		    			datos += "\t</file>\n";
		    		}
		    		datos += "\t<file>\n";
	    			datos += "\t\t<ruta>" + imagen + "</ruta>\n";
	    			datos += "\t\t<id>" + cont + "</id>\n";
	    			datos += "\t</file>\n";
		    		datos += "</files>";
		    		
		    		
		    		Acceso a = new Acceso();
		    		a.escribirXML(fichero,datos);
		    		
		    		
		    		//crea estructura de imagen en miniatura(con boton de borrado y raddiobuton)
		    		final Grid t_ext = new Grid(2,1);
		        	final Grid t_int = new Grid(1,2);
		        	final CellFormatter der = t_ext.getCellFormatter();
		        	
		    		der.setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_RIGHT);
		    		
		        	Image img_x = new Image();
		        	img_x.setUrl("curiam/images/cancel-upld.gif");
		        	
		        	//botón que accede a la imagen correspondiente y la borra
		        	final PushButton b_cerrar = new PushButton(img_x,
		    				
		    				new ClickHandler() {
		    					public void onClick(ClickEvent event) {
		    						
									Image img_ = (Image) t_ext.getWidget(1, 0);
									String nombre[] = URL.decode(img_.getUrl()).split("/");
									
									Acceso acc = new Acceso();
									acc.borrar_imagen(usuario.get(0),nombre[nombre.length-1]);
									
									vp.setVisible(t_ext.getElement(), false);
									
									
									
									for(int j=0;j<stp.getWidgetCount();j++){
										Grid tp1 = (Grid) stp.getWidget(j);
										Grid tp2 = (Grid) tp1.getWidget(0, 1);
										Image imp = (Image) tp2.getWidget(0, 1);
										
										if(imp!=null && imp.getUrl().equals(img_.getUrl()))
											tp2.remove(imp);
									}
									
		    					}
		    	    });
		        	b_cerrar.setStyleName("vinculo_analisis");
		        	
		        	RadioButton rb = new RadioButton("color", "");
		        	
		        	
		        	//enlace de la estructura
		        	Image image = new Image();
		        	image.setUrl("config/"+usuario.get(0)+"/"+imagen);
		        	
		        	t_ext.setWidget(0, 0, t_int);
		        	t_ext.setWidget(1, 0, image);
		        	
		        	t_int.setWidget(0, 0, rb);
		        	t_int.setWidget(0, 1, b_cerrar);
		        	
		        	image.setHeight("100px");
		        	image.setWidth("100px");
		        	
		        	hp_imagen.add(t_ext);
		    		
				}
			}
			
		});
		
		
				}
			}

		});
		
       
      }
    }
  };


}
