package fr.monkhanny.dorfromantik.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Database { // Chargement des variables d'environnement private static final String URL = "jdbc:mariadb://dwarves.iut-fbleau.fr/stiti"; private static final String LOGIN = "stiti"; private static final String PASSWORD = "stiti1234"; // Variable de passerelle entre le programme et la base de données private Connection database; /** * Ouvre la connexion avec la base de données */ public Database() throws SQLException { try { // Chargement du driver MariaDB Class.forName("org.mariadb.jdbc.Driver"); try { // Connexion à la base de données this.database = DriverManager.getConnection(URL, LOGIN, PASSWORD); }catch (SQLException e) { // Gestion de l'erreur de connexion throw new SQLException("Échec de la connexion à la base de données: " + e.getMessage(), e); } } catch (ClassNotFoundException e) { // Si le driver n'est pas trouvé throw new SQLException("Driver MariaDB introuvable dans le classpath", e); } } public Connection getDatabase() { return this.database; } /** * Récupère le seed correspondant au mode de jeu (series_id) * @param seriesId L'ID de la série (mode de jeu) * @return Le seed associé à ce mode de jeu * @throws SQLException Si une erreur se produit lors de la récupération du seed */ public long getSeedBySeriesId(long seriesId) throws SQLException { String query = "SELECT series_id FROM Series WHERE series_id = " + seriesId; long seed = -1; // Valeur par défaut si le seed n'est pas trouvé try (Statement stmt = this.database.createStatement(); ResultSet rs = stmt.executeQuery(query)) { if (rs.next()) { seed = rs.getLong("series_id"); } } return seed; } public List getAllScores(long seriesId) throws SQLException { List allScores = new ArrayList<>(); // Requête pour récupérer les scores et le nom de la série String query = "SELECT s.score, se.name " + "FROM Scores s " + "JOIN Series se ON s.series_id = se.series_id " + "WHERE s.series_id = ? " + "ORDER BY s.score DESC"; try (PreparedStatement stmt = this.database.prepareStatement(query)) { stmt.setLong(1, seriesId); // Paramètre pour filtrer par series_id try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { int score = rs.getInt("score"); String seriesName = rs.getString("name"); // Nom de la série // Ajouter l'objet PlayerScore à la liste avec un nom générique et le score allScores.add(new PlayerScore(seriesName, score)); // Ajout du nom de la série } } } return allScores; } public List getAllSeries() { List series = new ArrayList<>(); try { String query = "SELECT name FROM series ORDER BY date_created DESC"; // Trier par date Statement statement = this.database.createStatement(); ResultSet resultSet = statement.executeQuery(query); while (resultSet.next()) { series.add(resultSet.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } return series; } public long getSeedByName(String name) throws SQLException { String query = "SELECT series_id FROM Series WHERE name = " + "\'" + name + "\'" +";"; long seed = -1; // Valeur par défaut si le seed n'est pas trouvé try (Statement stmt = this.database.createStatement(); ResultSet rs = stmt.executeQuery(query)) { if (rs.next()) { seed = rs.getLong("series_id"); } } return seed; } public void addScore(long seriesId, int score) throws SQLException { String insertQuery = "INSERT INTO Scores (series_id, score) VALUES (?, ?)"; try (PreparedStatement stmt = this.database.prepareStatement(insertQuery)) { stmt.setLong(1, seriesId); stmt.setInt(2, score); stmt.executeUpdate(); } catch (SQLException e) { System.err.println("Erreur lors de l'ajout du score: " + e.getMessage()); throw e; } } public void addCustomSeed(String name, long customSeed) throws SQLException { // Vérifier si la seed existe déjà String checkQuery = "SELECT COUNT(*) FROM Series WHERE series_id = ?"; try (PreparedStatement checkStmt = this.database.prepareStatement(checkQuery)) { checkStmt.setLong(1, customSeed); ResultSet rs = checkStmt.executeQuery(); if (rs.next() && rs.getInt(1) > 0) { // la seed existe déjà return; // Ne pas insérer si la seed existe déjà } } // Si la seed n'existe pas, procéder à l'insertion String insertQuery = "INSERT INTO Series (name, series_id, creation_date) VALUES (?, ?, CURRENT_TIMESTAMP)"; try (PreparedStatement stmt = this.database.prepareStatement(insertQuery)) { stmt.setString(1, name); stmt.setLong(2, customSeed); stmt.executeUpdate(); } catch (SQLException e) { System.err.println("Erreur lors de l'ajout de la seed custom: " + e.getMessage()); throw e; } } /** * Récupère les meilleurs scores des joueurs (limite de 10 scores) * @return une liste de résultats sous forme de tableau contenant le score et la date formatée */ public List getTopPlayers() throws SQLException { List topPlayers = new ArrayList<>(); // Requête pour récupérer les scores et le nom de la série, triée par score décroissant String query = "SELECT s.score, se.name FROM Scores s " + "JOIN Series se ON s.series_id = se.series_id " + "ORDER BY s.score DESC LIMIT 10"; try (Statement stmt = this.database.createStatement(); ResultSet rs = stmt.executeQuery(query)) { while (rs.next()) { int score = rs.getInt("score"); String seriesName = rs.getString("name"); // Nom de la série // Ajouter l'objet PlayerScore à la liste topPlayers.add(new PlayerScore(seriesName, score)); // Assurez-vous que PlayerScore accepte un nom de série } } return topPlayers; } /** * Récupère les scores d'une série spécifique, triés en ordre décroissant (du plus élevé au plus bas) * @param seriesId L'ID de la série * @return Liste des scores pour la série donnée * @throws SQLException En cas d'erreur lors de la récupération des scores */ public List getScoresBySeriesId(long seriesId) throws SQLException { List scores = new ArrayList<>(); String query = "SELECT score FROM Scores WHERE series_id = ? ORDER BY score DESC"; try (PreparedStatement stmt = this.database.prepareStatement(query)) { stmt.setLong(1, seriesId); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { scores.add(rs.getInt("score")); } } } // If you want the scores to be in descending order (from highest to lowest) Collections.sort(scores, Collections.reverseOrder()); return scores; } public void close() { try { if (this.database != null && !this.database.isClosed()) { this.database.close(); } } catch (SQLException e) { System.err.println("Erreur lors de la fermeture de la base de données : " + e.getMessage()); } } }