package linea;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


// Cette classe est celle qui gère la connexion à la base de données Niveaux.db
public class NiveauxDataConnect {
    //Création d'une variable de connexion à la base de données
    private static final String url = "jdbc:sqlite:Niveaux.db";
    private static boolean tablesCreees = false; // Variable pour vérifier si les tables ont été créées



    // ------------- Constructeur de la classe ------------------------
    // Il initialise la connexion à la base de données
    // Il crée la table niveau si elle n'existe pas déjà
    // Il insérer les niveaux dans la table niveau directement
    // Pour éviter à le faire à chaque fois que le jeu est lancé
    // NB : Le fichier de la base de donnée est dans le .jar
    // Il est nécessaire de l'initialiser afin de pouvoir le lire et écrire dessus
    // Car dans la .jar il est en lecture seule
    // Il faut donc le copier dans un endroit où il peut être modifié, par exemple dans le dossier du projet
    // ----------------------------------------------------------------
    public NiveauxDataConnect() throws ClassNotFoundException {
        // Initialisation de la base de données dans le répertoire courant de l'utilisateur
        // Cela permet de pouvoir lire et écrire sur la base de données, contrairement à la base de données
        try {
            bddInit.init();
        }catch (IOException e) {
            throw new RuntimeException("Erreur lors de l'initialisation de la base de données : " + e.getMessage());
        }
        // Initialisation de la connexion à la base de données
        Connection conn = getConnection();
        if (conn != null) {
            System.out.println("Connexion à la base de données réussie !");
        } else {
            System.out.println("Connexion échouée !");
        }
    }


    // -------------------------------------------------------------------------
    // Méthode de connexion à la base de données Niveaux.db
    // -------------------------------------------------------------------------
    public static Connection getConnection() {
        try {
            Connection conn = DriverManager.getConnection(url);
            System.out.println("Connexion à la base de données réussie !");

            // Vérifier si les tables ont déjà été créées pour éviter de les recréer à chaque connexion
            if (!tablesCreees) {
                // Créer la table niveau si elle n'existe pas déjà
                CreerTableNiveaux(conn);
                tablesCreees = true; // Marquer les tables comme créées
                // Insérer les niveaux dans la table niveau
                insererNiveau(conn);
            }

            return conn;
        } catch (SQLException  e) {
            System.err.println("Erreur lors de la connexion à la base de données : " + e.getMessage());
            return null;                    
        }
    }


    // -------------------------------------------------------------------------
    // Méthode pour créer la table Niveaux si elle n'existe pas déjà
    // -------------------------------------------------------------------------
    private static void CreerTableNiveaux(Connection conn) {
    
        String sql = "CREATE TABLE IF NOT EXISTS niveau( "
           + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
           + "nom TEXT NOT NULL, " /*nom du niveau*/
           + "vitesse_ligne INTEGER NOT NULL, " /*vitesse de la ligne*/
           + "nb_segments INTEGER NOT NULL, "  /*nombre de segments à faire passer au joueur pour réussir le niveau*/
           + "image TEXT NOT NULL, " /*image du niveau*/
           + "multiplicateur_score INTEGER, " /*multiplier le score en fonction du niveau*/
           + "couleur_cercle TEXT NOT NULL, " /*Couleur du cercle en fonctiond du niveau */
           +");" ;  

        try (Statement stmt = conn.createStatement()) {
            stmt.execute(sql);
            stmt.close();
        } catch (SQLException e) {
            System.err.println("Erreur lors de la création de la table Niveaux : " + e.getMessage());
            System.out.println("Connexion échouée !");
            e.printStackTrace();
        }

    }


    // -------------------------------------------------------------------------
    // Méthode pour insérer les niveaux dans la base de données
    // Les niveaux sont connus à l'avance et sont insérés directement
    // dans la base de données pour éviter de les insérer à chaque fois que 
    // le jeu est lancé
    // --------------------------------Niveau 1 -------------------------------- 
    // nom = "Facile", vitesse_ligne = 5, nb_segments = 50, image = "images\ciel.jpeg", multiplicateur_score = 1, couleur_cercle = "bleu"
    // --------------------------------Niveau 2 -------------------------------- 
    // nom = "intermédaire", vitesse_ligne = 2, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 2, couleur_cercle = "gris"
    // --------------------------------Niveau 3 -------------------------------- 
    // nom = "Difficile", vitesse_ligne = 3, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 3, couleur_cercle = "marron"
    // --------------------------------Niveau 4 -------------------------------- 
    // nom = "Ultime", vitesse_ligne = 4, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 4, couleur_cercle = "violet"
    // -------------------------------------------------------------------------
    public static void insererNiveau(Connection conn) {
        String query1 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) " 
                        + "VALUES('Facile', 5, 50, 'images\\ciel.jpeg', 1, '#0000FF');";
                
        String query2 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
                        + "VALUES('Intermédiaire', 2, 100, 'images\\montagnes.jpg', 2, '#808080');";
        String query3 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
                        + "VALUES('Difficile', 3, 100, 'images\\volcan.jpg', 3, '#8B4513');";
        String query4 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
                        + "VALUES('Ultime', 4, 150, 'images\\espace.jpg', 4, '#9400D3');";

        try (Statement stmt = conn.createStatement()) {
            stmt.execute(query1);
            stmt.execute(query2);
            stmt.execute(query3);
            stmt.execute(query4);
            stmt.close();
        } catch (SQLException e) {
            System.err.println("Erreur lors de l'insertion des niveaux : " + e.getMessage());
        }
    }

    // -------------------------------------------------------------------------
    // Méthode pour récupérer les niveaux depuis la base de données
    // Elle retourne un niveau en fonction de son id
    // -------------------------------------------------------------------------    
    public static Niveau recupererNiveau(Connection conn, int id) {
        Niveau niveauRecup = null;
        String sql = "SELECT * FROM niveau WHERE id = ?;";
        
        try (Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                int id1 = rs.getInt("id");
                String nom = rs.getString("nom");
                int vitesse_ligne = rs.getInt("vitesse_ligne");
                int nb_segments = rs.getInt("nb_segments");
                String image = rs.getString("image");
                int multiplicateur_score = rs.getInt("multiplicateur_score");
                String couleur_cercle = rs.getString("couleur_cercle");
                niveauRecup = new Niveau(id1, nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle);
            }

        } catch (SQLException e) {
            System.err.println("Erreur lors de la récupération des niveaux : " + e.getMessage());
        }
        return niveauRecup;
    }


}
