/*
 * Fichero:     BaseDeDatosCatalogo.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 "catalogos", en la cual se almacenarán
 * 				los diferentes tipos y modelos de productos que existen para 
 * 				una posterior búsqueda. 
 * 
 * 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.*;

/**
 * Clase que representa un tabla en donde guardaremos los  datos más generales de los productos que registremos
 * @author  Alvaro Sarmiento Losada
 */ 

public class BaseDeDatosCatalogo {
	
	Connection con=null;
	int contador=0;
	
	public BaseDeDatosCatalogo() {
		String userName = "root";
		String password = "osito69";
		String url ="jdbc:mysql://localhost/test";
		try{
			Class.forName ("com.mysql.jdbc.Driver").newInstance();
			        	
			con = 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 tablas 
	 *  @return True si se hizo correctamente
	 *  @throws SQLException
	 */
	public boolean crearBaseDeDatos() throws SQLException{
	   /*Crea la tabla*/
	   Statement s= con.createStatement();
	   s.executeUpdate ("DROP TABLE IF EXISTS catalogos");
	   s.executeUpdate(
	       "CREATE TABLE catalogos("
	       + "id CHAR (40), PRIMARY KEY (id),categoria CHAR(40), producto CHAR(40),"
	       + "catalogo CHAR(40),id_par CHAR(40))");
	        
	    	
	   return true;
	}
	
	
	/**@return El conector de la tabla 
	 */
	public Connection devolverConector(){
		return con;
	}
	
	
	/**@return Un contador del u´ltimo elemnto introducido en la tabla
	 */
	public int devolverContador(){
		return contador;
	}
	
	
	/** Insertamos los datos que se nos pasan en el array
	 * @param array Un array con los datos a insertar
	 * @return Una cadena con el identificador asociado al 
	 * elemento introducido 
	 */
	public String insertarDatos(String [] array){
		/*Actualiza la tabla*/
		int count;
		String id=null;
		String categoria=null;
		String id_par=null;
		String producto=null;
		String catalogo=null;
				
		categoria=array[1];
		producto=array[3];	
		catalogo=array[5];
		id_par=array[7];
		
		try{
			contador++;
			Integer b=new Integer(contador);
			id=b.toString();
			PreparedStatement s = con.prepareStatement (
					"INSERT INTO catalogos(id,categoria,producto,catalogo,id_par)"
					+ "VALUES"
					+ "(?,?,?,?,?)");/*Esto son los valores que debemos pasarle al metodo*/
			s.setString(1,id);
			s.setString(2,categoria);
			s.setString(3,producto);
			s.setString(4,catalogo);
			s.setString(5,id_par);
			count=s.executeUpdate();
			s.close();
			System.out.println(count + " filas que que han sido insertadas");
		}catch(SQLException e){
			e.printStackTrace(System.out);
		}
		return id;
	}
	
	
	/** Para cerrar la conexion*/
	public void desconectarseCatalogos(){
		/*Desconectarse de la base de datos*/
	
		if(con != null)
		{
			try
			{
				con.close();
				System.out.println("Conexion con la Base de Datos terminada");
			}
			catch(Exception E){}

		}
	}

	
	
	/** Eliminamos datos de la tabla
	 * @param identificador_producto Identifica al elemento a eliminar 
	 * @param identificador_par Indica el par que realiza la operación
	 * @param base Puntero a la tabla de atributos
	 * @return True si fueé todo correcto.Eoc false
	 */
	public boolean quitarDatosCatalogos(String identificador_producto,String identificador_par,BaseDeDatosAtributos base){
		int count=0;
		boolean devolucion=false;
		ResultSet auxiliar=null;
		try{
			Statement s=con.createStatement();
			PreparedStatement p= con.prepareStatement("SELECT id FROM catalogos WHERE id_par=?");
			p.setString (1,identificador_par);
			auxiliar= p.executeQuery();
		
			
			while (auxiliar.next())  { 
				String identificador=auxiliar.getString(1);
				if(identificador.equals(identificador_producto)){
		
					try{
						count=base.quitarDatosAtributo(identificador_producto);			
						if(count!=0){
							count=0;	
							PreparedStatement k = con.prepareStatement ("DELETE FROM catalogos WHERE id=?");
							k.setString(1,identificador_producto);
							count=k.executeUpdate();
							s.close();
							if(count!=0){
								System.out.println("Se ha eliminado el elemento indicado");
								devolucion=true;
							}
			
						}else
							System.out.println("No ha podido efectuarse la eliminacion del producto ");
			
					}catch(SQLException e){}
				}else
					System.out.println("Queremos eliminar otro producto");
			}
		}catch(SQLException e){}
		if(count==0){
			System.out.println("No se ha permitido eliminar ese producto porque no pertenecia a ese par");
		
		}
		return devolucion;
	}
	
	
	/** Nos permite realizar una búsqueda en la tabla
	 * 
	 * @param base Puntero a la tabla de atributos de los productos
	 * @param aux Array donde se especifica los parámetros de búsqueda
	 * @return Un array de String con los identificadores de los elementos 
	 *  que cumplen los parametros.
	 * @throws SQLException
	 */
	public String[] buscar (BaseDeDatosAtributos base,String []aux) throws SQLException{
		
		ResultSet auxiliar=null;
		String categoria=aux[1];
		String producto=aux[3];
		String []cadena=new String[20];
		String []identificadores=new String[20];
		boolean encontrar=false;
		int cont=1;
		
		int i=0;
		int j=0;
		for(i=4,j=1;i<aux.length;i++,j++){ /*Es 4 pq es donde empiezan los atributos*/
			cadena[j]=aux[i];
			System.out.println(cadena[j]);
		}
		Statement s=con.createStatement();
		PreparedStatement p= con.prepareStatement("SELECT id,categoria,producto,catalogo FROM catalogos WHERE categoria like ? && producto like ?");
		p.setString (1,categoria);
		p.setString (2,producto);
		auxiliar= p.executeQuery();
		
		i=0;
		while (auxiliar.next()){ 
			encontrar=false;
			String identificador=auxiliar.getString(1);
			cadena[0]=identificador;
			System.out.println(cadena[0]);
			encontrar=base.buscarAtributos(cadena);
			if(encontrar!=false){		
				identificadores[i]=identificador;
				i++;
			}
		}
		if(i>0){	
			cont=0;
			for(j=0;identificadores[j]!=null;j++)
				cont++;
		}else{
			identificadores[0]="0";
		}
		
			String []resp=new String[cont];
			for(j=0;identificadores[j]!=null;j++)
				resp[j]=identificadores[j];
		
			p.close();
			auxiliar.close();
			s.close();
			
		return resp;
	}
	
	
	/** Se recopilan el elemento indicado
	 * 
	 * @param id Identificador de un elemento
	 * @param base Puntero a la base de los atributos 
	 * @return Un arreglo con las características del elemento
	 * @throws SQLException
	 */
	public String[] seleccionarDatosCatalogo(String id,BaseDeDatosAtributos base) throws SQLException{ /*He cambiado esto*/
		String[] resultado=new String[100];
		int j=0;
		int m=0;
		ResultSet auxiliar=null;
		
		/*for(i=0,j=0;i<id.length;i++){*/
			Statement s=con.createStatement();
			PreparedStatement p= con.prepareStatement("SELECT id,categoria,producto,catalogo,id_par FROM catalogos WHERE id=?");
			p.setString (1,id);/*cambio*/
			auxiliar= p.executeQuery();
			if(auxiliar.next()){
				/*Solo hay uno*/
				resultado[j]="id";
				resultado[j+1]=auxiliar.getString(1);
				resultado[j+2]="categoria";
				resultado[j+3]=auxiliar.getString(2);
				resultado[j+4]="producto";
				resultado[j+5]=auxiliar.getString(3);
				resultado[j+6]="catalogo";
				resultado[j+7]=auxiliar.getString(4);
				resultado[j+8]="id_par";
				resultado[j+9]=auxiliar.getString(5);
				j=j+10;
				String []aux=base.seleccionarDatosAtributos(id);/*cambio*/
				for(m=0;m<aux.length;m++,j++){
					resultado[j]=aux[m];
				}
			}
			p.close();
			auxiliar.close();
			s.close();
		/*}*/
		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];
		
				
		return resp;
	
		
	}
	
	
	/** Se devuelve todas las categorías almacenadas en la tabla sin repetirse
	 * 
	 * @param id Identificador de un par
	 * @return Arreglo con todas las categorías encontradas
	 * @throws SQLException
	 */
	public String[] seleccionarCategorias(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=con.createStatement();
			PreparedStatement p= con.prepareStatement("SELECT categoria FROM catalogos WHERE id=?");
			p.setString (1,id[i]);
			auxiliar= p.executeQuery();
			if(auxiliar.next()){
				/*Solo hay uno*/
				String categoria=auxiliar.getString(1);
				int k=0;
				boolean esta_presente=false;
				for(k=0; resultado[k]!=null;k++){
					if(resultado[k].equals(categoria))
						esta_presente=true;
				}
				if(esta_presente!=true)
					resultado[j++]=categoria;
			}
		}
		
		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;
	}
	
	
	/** Se selecciona los productos de unos determinados pares
	 * 
	 * @param id Arreglo con los pares que interesan
	 * @return Todos los productos escogidos
	 * @throws SQLException
	 */
	public String[] seleccionarProductos(String []id) throws SQLException{
		
		String[] resultado=new String[100];
		int i=0;
		int j=0;
		int cont=0;
		ResultSet auxiliar=null;
		
		System.out.println("Entramos en seleccionarProductos");
		for(i=0,j=0;i<id.length;i++){
			Statement s=con.createStatement();
			PreparedStatement p= con.prepareStatement("SELECT producto FROM catalogos WHERE id=?");
			p.setString (1,id[i]);
			auxiliar= p.executeQuery();
			if(auxiliar.next()){
				/*Solo hay uno*/
				String producto=auxiliar.getString(1);
				int k=0;
				boolean esta_presente=false;
				for(k=0; resultado[k]!=null;k++){
					if(resultado[k].equals(producto))
						esta_presente=true;
				}
				if(esta_presente!=true)
					resultado[j++]=producto;
			}
		}
		
		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]);
		}
				
		
		System.out.println("Salimos de seleccionarProductos");
		return solucion;
	}
	
	
	/** Tomamos todos los productos que hay de una determinada categoria
	 * 
	 * @param category La categoría de la cual queremos todos los productos
	 * @return Los productos registrados de esa categoria
	 * @throws SQLException
	 */
	public String[] visualizarProductos(String category) throws SQLException{
		
		String[] resultado=new String[100];
		int i=0;
		int j=0;
		int cont=0;
		ResultSet auxiliar=null;
		
		System.out.println("Entramos en seleccionarProductos");
		
			Statement s=con.createStatement();
			PreparedStatement p= con.prepareStatement("SELECT producto FROM catalogos WHERE categoria=?");
			p.setString (1,category);
			auxiliar= p.executeQuery();
			while(auxiliar.next()){
				/*Solo hay uno*/
				String producto=auxiliar.getString(1);
				int k=0;
				boolean esta_presente=false;
				for(k=0; resultado[k]!=null;k++){
					if(resultado[k].equals(producto))
						esta_presente=true;
				}
				if(esta_presente!=true)
					resultado[j++]=producto;
			}
		
		
		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]);
		}
				
		
		System.out.println("Salimos de visualizarProductos");
		return solucion;
	}
	
	
	/** Todos los atributos que hay en la base da datos para una categoría y producto concreto
	 * 
	 * @param id Arreglo que contiene la categoria y producto concretos
	 * @param base Puntero a la base de datos de los atributos
	 * @return Arreglo con todos los atributos que cumplan las condiciones
	 * @throws SQLException
	 */
	public String[] visualizarAtributos(String []id,BaseDeDatosAtributos base) throws SQLException{
		
		String[] resultado=new String[100];
		int j=0;
		int m=0;
		ResultSet auxiliar=null;
		String category=id[1];
		String product=id[3];
		String identificador=new String();
		
		if(category.equals("0")){
			PreparedStatement p= con.prepareStatement("SELECT id FROM catalogos WHERE producto=?");
			p.setString (1,product);
			auxiliar= p.executeQuery();
			while(auxiliar.next()){
			
		
				identificador=auxiliar.getString(1);
				
				String []aux=base.seleccionarDatosAtributos(identificador);
				for(m=0;m<aux.length;m++,j++){
					resultado[j]=aux[m];
				}
			}
		
			p.close();
			auxiliar.close();
		
			
		}else{
			Statement s=con.createStatement();
			PreparedStatement p= con.prepareStatement("SELECT id FROM catalogos WHERE categoria=? && producto=?");
			p.setString (1,category);
			p.setString (2,product);
			auxiliar= p.executeQuery();
			while(auxiliar.next()){
			
		
				identificador=auxiliar.getString(1);
				
				String []aux=base.seleccionarDatosAtributos(identificador);
				for(m=0;m<aux.length;m++,j++){
					resultado[j]=aux[m];
				}
			}
		
			p.close();
			auxiliar.close();
			s.close();
		}
		
		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];
		
				
		return resp;
	
		
	}
}
