/*
 * Fichero:     ClienteAplicacionServicioCatalogo.java
 * Fecha:       20/10/06
 * Autor:       Alvaro Sarmiento Losada
 * Asignatura:  Proyecto Fin de Carrera
 * Descripción: Contiene la clase ClienteAplicacionservicioCatalogo, cliente 
 * 				de la aplicación Catalogo. Buscará a los servidores y comenzará 
 * 				el intercambio de mensajes para cumplir las peticiones de los 
 * 				usuarios finales del sistema peertopeer elaborado.
 *
 * Este fichero pertenece al proyecto fin de carrera del autor,
 * consistente en el estudio de JXTA y su aplicación al comercio 
 * electrónico b2b.
 */

package com.pfc.catalogop2p.p2p;


import com.pfc.comercio.p2p.*;
import com.pfc.lib.p2p.*;
import com.pfc.lib.soap.*;
import com.pfc.ventanas.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;
import net.jxta.protocol.PeerAdvertisement;


/**
 * Clase que representa un cliente de unestra aplicación de catálogo
 * @author  Alvaro Sarmiento Losada
 */
public class ClienteAplicacionServicioCatalogo{
		
	/*Las distintas operaciones que puede hacer un cliente*/
	public final static String REGISTRAR = "registrar";
	public final static String BUSCAR = "buscar";
	public final static String ELIMINAR = "eliminar";
	public final static String PRODUCTOSREGISTRADOS = "registros";
	public final static String PRODUCTOSBUSCADOS = "buscados";
	public final static String PROVEE= "proveedor.txt";
	public final static String PROVEEDORES= "proveedores.txt";
	public final static String NUESTROSPRODUCTOS= "nuestrosproductos.txt";
	
	public final static String EXCEPCION= "Se produjo una excepcion en el servidor";
	public final static String ERROR= "Su peticion no era correcta";
	public final static String BIEN= "Su peticion ha sido aceptada";
	
	/*C:/Documents and Settings/Antonio/Mis documentos/cosas alvaro/proyecto_alvaro/*/
	String peticion=null ;
		
	public final static String DIRECTORIOS_DE_CATALOGOS = "./catalogos";  
	public final static String ARCHIVOS_DE_CATALOGOS = "catalogos.xml";
	/*hemos cambiad el nombre de tabla*/	
	public String [] array;
	public double id_producto;
	public static gestorVentanas gestor;
	
	
	
	
	//A partir de aqui lo he puesto para probar
	 /** El nombre del grupo JXTA por defecto donde ejecutará este servicio. */
    public static final String NOMBRE_GRUPO = "CatalogoP2P";
    
    /** La descripción del grupo JXTA donde ejecutará este servicio. */    
    public static final String DESCRIPCION_GRUPO = 
                 "Grupo JXTA donde está implementado el programa CatalogoP2P";
    
    /**
     * Método principal del cliente de la aplicación. Instancia una plataforma peertopeer
     * y crea una nueva instancia del cliente de catalogo peertopeer, el cual busca a un 
     * servidor de catálogos y manda peticiones SOAP. Posteriormente puede realizar operaciones
     * de comercio electrónico con otros clientes.
     *
     * @param args [-local o -global] [-debug] [-grupo NombreDelGrupo] <br>
     *             "-local" si se quiere tener accesibilidad solo en red
     *             local. <br>
     *             "-global" si se quiere tener accesibilidad en toda la red
     *             JXTA, incluyendo a la propia subred local.<br>
     *             Si no se especifica nada, se asume la opción "-local".<br>
     *             "-debug" si se desa información de debug.
     *             "-grupo NombreDelGrupo" si se desea especificar un
     *             grupo distinto al por defecto para iniciar ComercioP2P.
     */
    public static void main(String[] args) {
    	
   		
		gestor=new gestorVentanas();	
		
    	
        //Se crea la plataforma peertopeer basada en JXTA        
        Pares par=new Pares("cliente");
        try{
        	
    		int i=0;
    		System.out.println("Conectando... Por favor, espere");
    		par.limpiarCache();
    		String[] nombrepar=gestor.nombrePar();
    		par.configuraPeer(nombrepar[0],nombrepar[1],9710,9711,NOMBRE_GRUPO);
    		String ultimo=new String();
    		String anterior=null;
    		
    		
    		
    		String peticion=null;
        
    		System.out.println("Bienvenido a Catalogo v1.0");
    
        
    		/*
    		 * Se itera analizando los argumentos de la aplicación.
    		 */
    		i=0;
    		boolean exit=false;
    	
    			
    		System.out.println("Llegamos hasta aqui?");
    		GrupoDePeers grupo=new GrupoDePeers(par.grupoCatalogo);
    		
    		//Se crea el servicio JXTA
    		ClienteServicioCatalogoP2P cliente = new ClienteServicioCatalogoP2P(grupo);
                         
    		
        
    		//Se descubre cualquier peer del grupo.
    		grupo.descubrirPeers(null, null);
    		/*Ponemos osito porque es el nombre que le hemos dado a nuestro peer que hace de servidor*/
    		Enumeration enumPeers = grupo.descubrirPeersDelCache("Name","osito"); 
    		
    		if(enumPeers!=null){
    			System.out.println("Se ha encontrado algo");
    		}
    		
    		boolean salir=false; 	        
    		while ( (enumPeers.hasMoreElements() == true) && (enumPeers != null) && salir!=true) {
    			System.out.println("Probemos con este anuncio");  
    			/*Se prueba con cada anuncio encontrado*/
    			cliente.setDestinatario((PeerAdvertisement)enumPeers.nextElement());
    			boolean acabar=false;
    			
    			ClienteServicio client=new ClienteServicio();
    			/*Obtenemos el último nombre de nuestro par y el actual*/
    			String []pares=par.leerNombresPeer();
    			
    			int k=0;
    			for( k=0;pares[k]!=null;k++);
    			anterior=pares[k-1];
    			ultimo=nombrepar[0];
    			
    			/*Cambiamos nuestro nombre anterior por el actual en la base de datos*/
    			boolean ultimavez=client.cambioIdPar(anterior,ultimo); 
                

    			if(ultimavez==true){
    				par.guardarEnFichero(ultimo);
    				
                    while(acabar==false){
                    	/*Seleccionamos la peticion*/
                    	String []petic=gestor.escogerPeticion();
        				System.out.println(petic[0]);
        				peticion=petic[0];
        				client.invocarServicio(peticion,ultimo);/*antes ponia servidor*/
                
        				/*Realizar una nueva operacion*/
        				String decision=gestor.otraOperacion();
        			
        				if(decision!="si")
        					acabar=true;
        						
        				
        			}
                    
                    boolean otravez=true;
                    
                    while(otravez==true){
                    	String decision_compra=gestor.decisionCompra();
                    	
                    	/*Elegimos comprar u producto*/
	                    if(decision_compra.equals("comprar")){
	                    	String []sigo=new String[100]; 
	                    	/*Debemos primero preguntar por el id del producto y por el nombre del proveedor*/
	                    	String []compra=gestor.datosCompra();
	                    	for(i=0;i<compra.length;i++)
	                    		System.out.println(compra[i]);
	                    	
	                    	/*Comprobamos que esta en nuestro fichero proveedores y devolvemos un array de String con los elementos*/
	                    	try{
	                    		BufferedReader br = new BufferedReader(new FileReader(PROVEEDORES));
	                    		String s;                  	    
	                    		 
	                    		i=0;
	                    		while ((s = br.readLine())!= null) {
	                    			sigo[i]=s;
	                    			i++;
	                    		}
	                    	}catch(Exception e){
	                    		e.printStackTrace(System.out);
	                    	}
	                    	boolean seguir=true;
	                    	String []proveedor=new String[100];
	                    	
	                    	for(i=0;sigo[i]!=null && seguir!=false;i++){
	                    		int j=0;
	                        	int contador=0;
	                        	int indice=0;
	                        	exit=false;
	                    		String apoyo=new String();
	                    		for(j=0;exit!=true;j++){
	    							indice=sigo[i].indexOf(":",contador);			
	    							apoyo=sigo[i].substring(contador,indice);
	    							System.out.println(apoyo);
	    							indice++;
	    							contador=indice;
	    			
	    							if(apoyo.equals("null"))
	    								exit=true;
	    							else
	    								proveedor[j]=apoyo;
	    						}
	                    		if(proveedor[0].equals(compra[0]) && proveedor[2].equals(compra[1]))
	                    			seguir=false;
	                    	}
	                    	if(seguir!=false){
	                    		System.out.println("Los datos del proveedor no son conocidos");
	                    	}
	                    	else{
	                    		/*Despues llamamos a una funcion que busque el servicio de Comercio*/
	                    		ClienteCompra clientecompra=new ClienteCompra(grupo);
	                    		String []comprador=clientecompra.datosComprador(PROVEE, ultimo);
	                    		System.out.println("Hemos obtenido los datos del comprador");
	                    		/*Realizamos transacciones*/
	                    		clientecompra.buscarComerciante(grupo,proveedor,comprador);
	                        	
	                    	}
	                    	
	                    
	                    /*Seleccionamos esperar la llegada de peticiones de compra de nuestros productos*/
	                    }else if(decision_compra.equals("esperar")){
	                    	ServidorComercio comercio=new ServidorComercio(grupo);
	                    	comercio.inicializar();
	                    	comercio.ejecutar();
	                    	
	                    	
	                    /*Se sale del programa*/	
	                    }else{
	                    	System.out.println("Se va a salir del programa");
	                    	otravez=false;
	                    }
                    }
                   
                /*Problemas al conectar con el servidor*/
        		}else	
        			gestor.noConecta();
    			System.out.println("Se acabo el cliente");
    			salir=true;
        		
    		}
        		
        }catch(ExcepcionP2P ep2p){
        	System.out.println("Se produjo una excepcion durante el proceso P2P");
        }catch(ExcepcionMensajeSOAP ems){
        	System.out.println("Se produjo una excepcion al enviar mensajes SOAP");
    	}catch(Exception e){
    		System.out.println("Se produjo una excepcion durante el transcurso de unestra aplicación");
    	}
    }
}