package Models;

import Controllers.Dialog.ShowDialog;
import Controllers.Traitement.ParametreSystem;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *@author Maher Ben Tili
 */
public class connexion {
    
    String url = ParametreSystem.JdbcUrl;
    String dbName = ParametreSystem.JdbcDB;
    String userName = ParametreSystem.JdbcUser; 
    String password = ParametreSystem.JdbcPassword;
    
    /*String url = "jdbc:mysql://localhost:3306/powerpme?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
    String dbName = "powerpme";
    String userName = "root"; 
    String password = "bentili";*/
    Connection conn = null;
    Statement statement = null;
    ResultSet resultat = null;
        
    public boolean insertion(String req)
    {
        boolean resulta = false  ;
        
         if(this.ouverture()){
            try{
                int statut = statement.executeUpdate(req);
                if(statut>0){
                    resulta= true ;
                }
            }
           catch(SQLException ex){
               System.out.println("requête d'insertion : \n" +req);
                ShowDialog SD = new ShowDialog();
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
                resulta= false ;
                
            }
            finally {
                this.fermeture();
            }
        }
         else{
             resulta= false ;
         }
        return resulta ;
    }
    
    
    public int MettreAJour(String sql){
        Integer nbr = 0 ;
        if(this.ouverture()){
            try{
                nbr = this.executionupdate(sql);
            }
            catch(SQLException ex){
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                System.out.println("requête d'insertion : \n" +sql);
                ShowDialog SD = new ShowDialog();
                SD.ShowAletDialog();
            }
            finally {
                this.fermeture();
            }
        }
        return nbr ;
    }
    
    
    public String InsertGetLastId(String req) 
    {
        String LastId = null ; 
        if(this.ouverture()){
            try{
                PreparedStatement pstmt = conn.prepareStatement(req, statement.RETURN_GENERATED_KEYS);
                pstmt.executeUpdate();
                ResultSet keys = pstmt.getGeneratedKeys();    
                keys.next();  
                LastId = keys.getLong(1)+"";
            }
           catch(SQLException ex){
                 System.err.println("Erreur SQL ! \n"+ex.getMessage());
                 System.out.println(req);
                 
                 ShowDialog SD = new ShowDialog();
                 ShowDialog.setTitre("Erreur SQL !");
                 ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                 SD.ShowAletDialog();
            }
            finally {
                this.fermeture();

            }
        }
        return LastId ;
    }
    
    public ResultSet excutionquery(String req) throws SQLException{
       /* Exécution d'une requête de lecture */
       resultat = statement.executeQuery(req);
       /* Récupération des données du résultat de la requête de lecture */
       return resultat;
            
    }
    
    public ResultSet FetchALL(String req){
        if(this.ouverture()){
            try{
                // Exécution d'une requête de lecture 
                resultat = this.excutionquery(req);
                
                //on place le curseur sur le dernier tuple
                resultat.last();
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                
                if(nombreLignes>0){
                    //on repace le curseur avant la première ligne
                    resultat.beforeFirst();
                }
            } catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        } 
        return resultat;
    }
    
    
    public ResultSet Fetch(String req){
        if(this.ouverture()){
            try{
                // Exécution d'une requête de lecture 
                resultat = this.excutionquery(req);
                
                //on place le curseur sur le dernier tuple
                resultat.last();
                
            } catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        } 
        return resultat;
    }
    
    public Integer CoutNumber(String Query){
        Integer Sommme = 0;
        if(this.ouverture()){
            try{
                ResultSet resultat = statement.executeQuery(Query);
               
                resultat.next();    // get the number of rows from the result set
                Sommme = resultat.getInt(1);
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(Query);
            }
            finally {
                this.fermeture();
            }
        }
        return Sommme;
    }
    
    
    
    public int executionupdate(String req) throws SQLException{
       /* Exécution d'une requête de lecture */
       int nbr = statement.executeUpdate(req);
       /* Récupération des données du résultat de la requête de lecture */
       this.fermeture();
       return nbr;
            
     }
    
    
    public CallableStatement  executePLSQL(String sql){
        try {
            Class.forName( "com.mysql.cj.jdbc.Driver" );
            conn = DriverManager.getConnection (url,userName,password);
            return  conn.prepareCall(sql);  
        } 
        catch (ClassNotFoundException e ) {
            System.err.println("Erreur lors du chargement : le driver n'a pas été trouvé dans le classpath !");
            return null;
        }
        catch (SQLException ex) {
            System.err.println("Erreur lors d\'ouverture de la base de données");
            return null;
        }
            
    }
    
    
    
            /*  Connexion et ouverture de la base de données   */
    public boolean  ouverture(){
        try {
            Class.forName( "com.mysql.cj.jdbc.Driver" );
            conn = DriverManager.getConnection (url,userName,password);
            conn.setAutoCommit(false);
            statement = conn.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            return true;
        } 
        catch (ClassNotFoundException e ) {
            ShowDialog.setTitre("Erreur lors du chargement : le driver n'a pas été trouvé dans le classpath !");
            ShowDialog.setDetail(e.getMessage());
            ShowDialog SD = new ShowDialog();
            SD.ShowAletDialog();
            return false;
        }
        catch (SQLException ex) {
            ShowDialog.setTitre("Erreur lors d\'ouverture de la base de données");
            ShowDialog.setDetail(ex.getMessage());
            ShowDialog SD = new ShowDialog();
            SD.ShowAletDialog();
            return false;
        }
    }
    
    
    
    /*Femiture de la connexion de base de données*/
    public void fermeture(){
        if ( resultat != null ) {
                try {
                    resultat.close();
                } catch ( SQLException ignore ) {
                   ShowDialog.setTitre("Erreur lors du Fermeture BD:");
                   ShowDialog.setDetail(ignore.getMessage());
                   ShowDialog SD = new ShowDialog();
                   SD.ShowAletDialog();    
            
                }
            }   
            
           if ( statement != null ) {
                try {
                    statement.close();
                } catch ( SQLException ignore ) {
                    ShowDialog.setTitre("Error statement: BD:");
                    ShowDialog.setDetail(ignore.getMessage());
                    ShowDialog SD = new ShowDialog();
                    SD.ShowAletDialog();
                }
            }
           
            if ( conn != null ) {
                try {
                    conn.commit();
                    //conn.close();
                } catch ( SQLException ignore ) {
                    ShowDialog.setTitre("Erreur lors de fermeture de Connexion: ");
                    ShowDialog.setDetail(ignore.getMessage());
                    ShowDialog SD = new ShowDialog();
                    SD.ShowAletDialog();
                }
            }
    }
    
}