package franchiser;
import java.sql.*;


public class DBManager{
  /** Prende l'url della connessione al DataBase: <code>jdbc:firebirdsql://127.0.0.1/C:/DBFRANCHISING.GDB</code>
    */
  public DBManager()throws ClassNotFoundException, InstantiationException{
    this.url="jdbc:firebirdsql://127.0.0.1/C:/InterbaseDB/DBFRANCHISING.GDB";
    try{
    // nel costruttore inizializza l'oggetto e lo prepara alla chiamata di query
      Class.forName(connessione).newInstance();
      conn = DriverManager.getConnection(url, "SYSDBA", "masterkey");
      st=conn.createStatement();// crea lo statement...
    }catch(SQLException sq){
      System.out.println("Error in DBManager object building: "+sq);
    }catch(IllegalAccessException iae){
      System.out.println("Error in DBManager object building: "+iae);
    }
  }

  /** La query serve per la ricerca di una tupla intera partendo dall'inserimento di un campo
    */
  public ResultSet query(String tabella, String campo, String valore)throws SQLException{
    String dbquery="SELECT * FROM "+tabella+" WHERE "+campo+" LIKE '"+valore+"'";
    ResultSet rs=st.executeQuery(dbquery);
    return rs;
  }

  /** La query serve per la ricerca di una tupla intera partendo dall'inserimento di una soglia di prezzo<br>
    * Il parametro <code>symbol</code> prende solo valori '<', '>', '='
    */
  /* per la ricerca dei prezzi */
  public ResultSet query(String tabella, String campo, String symbol, int valore)throws SQLException{
    String dbquery=null;
    ResultSet rs=null;
    if((!symbol.equals("<")) && (!symbol.equals(">")) && (!symbol.equals("=")))
      System.out.println("Wrong format of variable symbol, it can be only '<', '>', '='");
    else{
      dbquery="SELECT * FROM "+tabella+" WHERE "+campo+" "+symbol+" "+valore;
      rs=st.executeQuery(dbquery);
    }
    return rs;
  }

  /** La query serve per la ricerca di una tupla intera partendo dall'inserimento di una soglia di prezzo<br>
    */
  /* per la ricerca dei prezzi */
  public ResultSet query(String categoria, String pre_min, String pre_max, String marca)
                   throws SQLException{
    String dbquery=null;
    ResultSet rs=null;
    dbquery="SELECT * FROM MAGAZZINO WHERE ";
    int cols=0;
    if(categoria!=null && !categoria.equals("")){
      dbquery += "CATEGORIA LIKE '" + categoria + "' ";
      cols++;
    }
    if(pre_min!=null && !pre_min.equals("")){
      if(cols>0)
        dbquery+=" AND ";
      dbquery+=" PREZZO > "+pre_min+" ";
      cols++;
    }

    if(pre_max!=null && !pre_max.equals("")){
      if(cols>0)
        dbquery+=" AND ";
      dbquery+=" PREZZO < "+pre_max+" ";
      cols++;
    }

    if(marca!=null && !marca.equals("")){
     if(cols>0)
       dbquery+=" AND ";
     dbquery+=" MARCA LIKE '"+marca+"' ";
     cols++;
   }
   dbquery+=";";


    rs=st.executeQuery(dbquery);

    return rs;
  }

  /** Metodo privato richiamato da <code>addSell()</code> per l'aggiornamento del prodotto venduto
    */
  private boolean update(String valore, int pz)throws SQLException{
    String update="UPDATE MAGAZZINO SET SCORTA = SCORTA - "+pz+" WHERE CODICE LIKE '"+valore+"'";
    st.executeUpdate(update);
    return true;
  }

  /** Utilizzando tutti i campi della tabella, inserisce una nuova vendita incrementando il
    * progressivo appartenente ad un franchiser
    */
  public boolean addSell(String idf, String idprod, int pz,
                         String cog, String nom, String cf, String date)
      throws SQLException, NumberFormatException{
     /* calcolo del massimo */
    String maxxx="SELECT MAX(PROGRESSIVO) FROM VENDITE WHERE ID_CF LIKE '"+ idf +"'";
    String pezzi="SELECT * FROM MAGAZZINO WHERE CODICE LIKE '"+ idprod +"'";
    ResultSet r=null;
    ResultSet pzz=null;
    try{
      r=st.executeQuery(maxxx);
    }catch(SQLException sq){
      System.out.println("Error in SELECT MAX(PROGRESSIVO) FROM VENDITE: "+sq);
    }
    try{
      pzz=st.executeQuery(pezzi);
    }catch(SQLException sq){
      System.out.println("Error in SELECT * FROM MAGAZZINO: "+sq);
    }
    String num=null;
    int pez=0;
    while(r.next())
       num = r.getString(1);
    while(pzz.next())
       pez = Integer.parseInt(pzz.getString("SCORTA"));
    int progr=0;
    try{ // serve al primo acquisto per conto di di un franchiser
      progr=Integer.parseInt(num);
    }catch(NumberFormatException ne){
      progr=0;
    }
    progr++;
     /* query */
    boolean isUpdate=false;
    if(pez>0){
      String query="INSERT INTO VENDITE VALUES('"+idf+"', '"+progr+"', '"+idprod+"', '"+pz+"', '"+cog+"', '"+nom+"', '"+cf+"', '"+date+"' );";
      isUpdate=true;
      try{
        st.executeUpdate(query); //inserimento
      }catch(SQLException sq){
        System.out.println("Error in INSERT INTO VENDITE: "+sq);
        isUpdate=false;
      }
      if(isUpdate){
      System.out.println("isUpdate!");
        this.update(idprod,pz);
      }
    }
    return isUpdate;
  }

  public int delete(String tabella, String campo, String valore){
          int righe=0;
                try{
                        st=conn.createStatement();

                        String sqlCommand="DELETE FROM "+ tabella +
                                " WHERE " + campo + " LIKE '" + valore + "';";

                        righe=st.executeUpdate(sqlCommand);

                        }

                catch(SQLException e){

                        System.out.println("Problemi con la cancellazione \n");
                        e.printStackTrace();
                        System.exit(1);
                        }
        return righe;
       }
       public ResultSet query(String tabella, String campo, String valore, String campo2, String valore2){
               ResultSet rs=null;
               try{
                       st=conn.createStatement();

                       String sqlCommand="SELECT * FROM "+ tabella +
                               " WHERE " + campo + " LIKE '" + valore + "' AND " + campo2 + " LIKE '" + valore2 + "';";

                       rs=st.executeQuery(sqlCommand);

                       }

               catch(SQLException e){

                       System.out.println("Problemi con la query\n");
                       e.printStackTrace();
                       System.exit(1);
                       }
               return rs;

       }


  private final String url; //una volta impostato non è modificato
  /* utilizzabile da tutti gli oggetti */
  private static final String connessione="org.firebirdsql.jdbc.FBDriver";
  private Statement st;
  private Connection conn;
}

