/*
 * Fichero:     BaseDeDatosAtributos.java
 * Fecha:       20/10/06
 * Autor:       Alvaro Sarmiento Losada
 * Asignatura:  Proyecto Fin de Carrera
 * Descripción: Es una clase para la creación y modificación  de una base 
 * 				de datos denominada "atributos", en la cual se almacenarán
 * 				las características de un determiado producto que hayamos 
 * 				registrado en la base de datos denominada "catalogos".
 * 
 * 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.bases;

import java.sql.*;


/**
 * Tabla en donde almacenamos las características de los productos
 * @author  Alvaro Sarmiento Losada
 */
public class BaseDeDatosAtributos {
	
	Connection conn=null;
	

	public BaseDeDatosAtributos() {

		String userName = "root";
		String password = "osito69";
		String url ="jdbc:mysql://localhost/test";
		try{
			Class.forName ("com.mysql.jdbc.Driver").newInstance();
				        	
			conn = DriverManager.getConnection(url, userName, password);
			System.out.println ("Conexion con la base de datos establecida");
			if(crearBaseDeDatos())
				System.out.println("Se ha creado la base de  datos");
		}catch (Exception E){
			System.out.println("No se puede conectar con el servidor de la Base de Datos");
		}
	}
		
	
	/** Permite la creación de la tabla
	 * 
	 * @return True si fue realizada con éxito. Eoc false
	 * @throws SQLException
	 */
	public boolean crearBaseDeDatos() throws SQLException{
		/*Crea la tabla*/
		 Statement s= conn.createStatement();
		 s.executeUpdate ("DROP TABLE IF EXISTS atributos");
		 s.executeUpdate(
		     "CREATE TABLE atributos("
		     + "id CHAR (40),atributo CHAR(40), valor CHAR(40))");
		        
		    	
		 return true;
	}
	
	
	/** Devuelve el valor del identificador del ultimo elemento registrado
	 * 
	 * @return Un entero que indica el identificador del último elemnto registrado
	 */
	public int devolverContador(){
		int contador=0;
		ResultSet auxiliar=null;
		String id=new String();
		try{
			Statement s=conn.createStatement();
			PreparedStatement p= conn.prepareStatement("SELECT id FROM atributos ");
			auxiliar= p.executeQuery();
	
			if(auxiliar!=null){
				while(auxiliar.next()){			
					id=auxiliar.getString(1);
				}
				contador=Integer.parseInt(id);
				System.out.println("contador:"+contador);
			}else{
				contador=0;
			}
		}catch(SQLException e){}
		
		contador=Integer.parseInt(id);
		System.out.println("contador:"+contador);
		return contador;
	}
		
	
	/** Devuelve un conector a la base de datos
	 * 
	 * @return El conector deseado
	 */
	Connection devolverConector(){
		return conn;
	}
		 
	
	/** Permite la desconexion de la base de datos*/
	public void desconectarseCatalogos(){
		/*Desconectarse de la base de datos*/
		
		if(conn != null){
			try{
				conn.close();
				System.out.println("Conexion con la Base de Datos terminada");
			}catch(Exception E){}

		}
	}
	
	/** Elimina todas las características de un producto concreto
	 * 
	 * @param identificador_producto Identifica el producto a eliminar 
	 * @return
	 */
	public int quitarDatosAtributo(String identificador_producto){
		int count=0;
		try{	
			PreparedStatement s = conn.prepareStatement (
					"DELETE FROM atributos WHERE id=?");
			s.setString(1,identificador_producto);
			count=s.executeUpdate();
			if(count!=0){
				s.close();
			}else
				System.out.println("No ha podido efectuarse la eliminacion del producto ");
		}catch(SQLException e){}
			
		return count;
	}
	
	
	/** Introduce unas características en la tabla
	 * 
	 * @param array Arrglo en el que se guarda en primera posición
	 * 	el identificador del producto del que trata y en sucesivas 
	 * 	las características a guardar
	 */
	public void insertarDatos(String [] array){
		/*Actualiza la tabla*/
		int i,count;
		int j=0;
		int longitud=(array.length-1)/4;
		System.out.println(longitud);
		String []atributo=new String[longitud];
		String []valor=new String[longitud];
		String id=array[0];	
			
		for(i=1,j=0;i<array.length;i++,j++){
			atributo[j]=array[i+1];
			System.out.println(atributo[j]);
			i=i+2;
			valor[j]=array[i+1];
			System.out.println(valor[j]);
			i=i+1;
		}
			
		try{
			
			for(i=0;i<atributo.length;i++){
				String atrib=atributo[i];
				String val=valor[i];
				PreparedStatement s = conn.prepareStatement ("INSERT INTO atributos(id,atributo,valor) VALUES (?,?,?)");/*Esto son los valores que debemos pasarle al metodo*/
				s.setString(1,id);
				s.setString(2,atrib);
				s.setString(3,val);
				count=s.executeUpdate();
				System.out.println(count + " filas que que han sido insertadas");
			}
			
		}catch(SQLException e){
			System.out.println("Hay problemas");
		}
	}

	
	/** Permite saber si un elemento registrado tiene unas características concretas
	 * 
	 * @param array Arreglo donde en primera posición se indica el identificador de elemento y en sucesivas las características deseadas
	 * @return True si el elemnto tiene las características buscadas. Eoc false
	 * @throws SQLException
	 */ 
	public boolean buscarAtributos(String []array) throws SQLException{
		int i=0; 
		int j=0;
		int contador=0;
		boolean encontrado=false;
		
		Statement s= conn.createStatement();
		
		String ide=array[0];
		System.out.println("id:"+ide);
		int longitud=0;
		/*for(i=0;i<array.length;i++){
			if(array[i].equals("precio"))
				if(array[i].equals("igual"))
		}*/
		longitud=array.length;
		String []atributo=new String[longitud-1];
		String []valor=new String[longitud-1];
		
						
		String comparacion=new String();
		for(i=1,j=0;i<array.length && array[i]!=null;i++,j++){/*i=1 pq el primer elemento es identificador de elemento*/
			
			if(array[i+3].equals("mayor") || array[i+3].equals("menor") || array[i+3].equals("igual")){
				comparacion=array[i+3];
				atributo[j]=array[i+1]; /*atributo y valor deben tener el mismo número de elementos*/
				System.out.println("atributo i:"+atributo[j]);
				valor[j]=array[i+5];
				System.out.println("valor i:"+valor[j]);
				i=i+5;
				contador++;
			}else{
				atributo[j]=array[i+1]; /*atributo y valor deben tener el mismo número de elementos*/
				System.out.println("atributo i:"+atributo[j]);
				valor[j]=array[i+3];
				System.out.println("valor i:"+valor[j]);
				i=i+3;
				contador++;
			}
			
		}
		
		i=0;
		int result=1;
		while(i<contador && encontrado!=true){
			if(comparacion.equals("mayor")){
				ResultSet rs=null;
				PreparedStatement p= conn.prepareStatement("SELECT * FROM atributos WHERE id like ? && atributo like ? && valor>?");
				p.setString(1,ide);
				p.setString(2,atributo[i]);
				p.setString(3,valor[i]);
				rs=p.executeQuery();
				
				if(rs.next())
					//encontrado=true;
					result=result*1;
				else
					//encontrado=false;
					result=result*0;
				comparacion="";
				p.close();
				rs.close();
				
			}else if(comparacion.equals("menor")){
				ResultSet rs=null;
				PreparedStatement p= conn.prepareStatement("SELECT * FROM atributos WHERE id like ? && atributo like ? && valor<?");
				p.setString(1,ide);
				p.setString(2,atributo[i]);
				p.setString(3,valor[i]);
				rs=p.executeQuery();
				
				if(rs.next())
					//encontrado=true;	
					result=result*1;
				else
					//encontrado=false;
					result=result*0;
				comparacion="";
				p.close();
				rs.close();
			}else{
				ResultSet rs=null;
				PreparedStatement p= conn.prepareStatement("SELECT * FROM atributos WHERE id like ? && atributo like ? && valor like ?");
				p.setString(1,ide);
				p.setString(2,atributo[i]);
				p.setString(3,valor[i]);
				rs=p.executeQuery();
			
				if(rs.next())
					//encontrado=true;
					result=result*1;
				else
					//encontrado=false;
					result=result*0;
				p.close();
				rs.close();
			}
			
			i++;
			
		}
		
		s.close();
		if(result!=0)
			encontrado=true;
		
	
		return encontrado; /*si devuelve true es pq todas han sido encontradas*/
	}
	
	
	/** Toma las características del producto indicado
	 * 
	 * @param id Identificador del producto
	 * @return Arreglo con las características del producto
	 * @throws SQLException
	 */
	public String []seleccionarDatosAtributos(String id) throws SQLException{
		String[] resultado=new String[50];
		int j=0;
		ResultSet auxiliar=null;
		
		Statement s=conn.createStatement();
		PreparedStatement p= conn.prepareStatement("SELECT * FROM atributos WHERE id=?");
		p.setString (1,id);
		auxiliar= p.executeQuery();
	
		while(auxiliar.next()){			
			resultado[j]="atributo";
			resultado[j+1]=auxiliar.getString(2);
			resultado[j+2]="valor";
			resultado[j+3]=auxiliar.getString(3);
			j=j+4;
		}
		int cont=0;
		for(j=0;resultado[j]!=null;j++)
			cont++;
		
		String []resp=new String[cont];
		for(j=0;resultado[j]!=null;j++)
			resp[j]=resultado[j];
		
		p.close();
		auxiliar.close();	
		s.close();
		
		return resp;
	}
	
	
	/** Selecciona sólo los atributos de los elementos indicados
	 * 
	 * @param id Arreglo con los identificadores de los productos que interesan
	 * @return Array de los atributos buscados
	 * @throws SQLException
	 */
	public String[] seleccionarAtributos(String []id) throws SQLException{
		String[] resultado=new String[100];
		int i=0;
		int j=0;
		int cont=0;
		ResultSet auxiliar=null;
		
		
		for(i=0,j=0;i<id.length;i++){
			Statement s=conn.createStatement();
			PreparedStatement p= conn.prepareStatement("SELECT atributo FROM atributos WHERE id=?");
			p.setString (1,id[i]);
			auxiliar= p.executeQuery();
			while(auxiliar.next()){
				/*Solo hay uno*/
				String atributo=auxiliar.getString(1);
				int k=0;
				/*boolean esta_presente=false;
				for(k=0; resultado[k]!=null;k++){
					if(resultado[k].equals(atributo))
						esta_presente=true;
				}
				if(esta_presente!=true)
					resultado[j++]=atributo;*/
				resultado[j++]=atributo;
				System.out.println(atributo);
			}
		}
		
		for(i=0;resultado[i]!=null;i++)
			cont++;
		String [] solucion=new String[cont];
			
		for(i=0;i<cont;i++){
			solucion[i]=resultado[i];
			System.out.println(solucion[i]);
		}
				
		return solucion;
	}
	
	
	/** Selecciona los valores que toman los atributos para lo productos que se pasan como parámetro
	 * 
	 * @param id Identificadores de productos
	 * @return Arreglo con los valores que toman los productos 
	 * @throws SQLException
	 */ 
	public String[] seleccionarValor(String []id) throws SQLException{
		String[] resultado=new String[100];
		int i=0;
		int j=0;
		int cont=0;
		ResultSet auxiliar=null;
		
		
		for(i=0,j=0;i<id.length;i++){
			Statement s=conn.createStatement();
			PreparedStatement p= conn.prepareStatement("SELECT valor FROM atributos WHERE id=?");
			p.setString (1,id[i]);
			auxiliar= p.executeQuery();
			while(auxiliar.next()){
				/*Solo hay uno*/
				String valor=auxiliar.getString(1);
	
				/*int k=0;
				boolean esta_presente=false;
				for(k=0; resultado[k]!=null;k++){
					if(resultado[k].equals(valor))
						esta_presente=true;
				}
				if(esta_presente!=true)
					resultado[j++]=valor;*/
				resultado[j++]=valor;
				System.out.println(valor);
			}
		}
		
		for(i=0;resultado[i]!=null;i++)
			cont++;
		String [] solucion=new String[cont];
			
		for(i=0;i<cont;i++){
			solucion[i]=resultado[i];
			System.out.println(solucion[i]);
		}
				
		return solucion;
	}
	
	
}


