import 'package:flutter/foundation.dart'; import 'package:sqflite_common/sqflite.dart'; import '../models/pokemon.dart'; // Permet de gérer la base de données class PokedexDatabase { static Database? database; static final ValueNotifier onDatabaseUpdate = ValueNotifier(0); static Future initDatabase() async { database = await openDatabase( "pokedex.db", // Nom de la base de données version: 2, // Version de la base de données, permet de gérer les migrations onUpgrade: (db, oldVersion, newVersion) async { if (oldVersion < 2) { await db.execute("DROP TABLE IF EXISTS pokemon"); await db.execute("CREATE TABLE pokemon (id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, type1 TEXT NOT NULL, type2 TEXT, hp INTEGER NOT NULL, atk INTEGER NOT NULL, def INTEGER NOT NULL, spd INTEGER NOT NULL, description TEXT, isCaught INTEGER NOT NULL DEFAULT 0, isSeen INTEGER NOT NULL DEFAULT 0)"); } }, onCreate: (db, version) async { // Fonction qui sera appelée lors de la création de la base de données // Création de la table pokemon avec les colonnes... await db.execute("CREATE TABLE IF NOT EXISTS pokemon (id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, type1 TEXT NOT NULL, type2 TEXT, hp INTEGER NOT NULL, atk INTEGER NOT NULL, def INTEGER NOT NULL, spd INTEGER NOT NULL, description TEXT, isCaught INTEGER NOT NULL DEFAULT 0, isSeen INTEGER NOT NULL DEFAULT 0)"); }, ); } // Méthode qui permet de récupérer la base de données static Future getDatabase() async { if (database == null) { await initDatabase(); // On initialise la base de données si elle n'est pas encore initialisée } return database!; } // Méthode qui permet d'insérer un Pokémon dans la base de données static Future insertPokemon(Pokemon pokemon) async { Database database = await getDatabase(); await database.insert( 'pokemon', pokemon.toJson(), conflictAlgorithm: ConflictAlgorithm.replace, ); onDatabaseUpdate.value++; } // Méthode qui permet de récupérer la liste des pokémons dans la base de données static Future> getPokemonList() async { Database database = await getDatabase(); var response = await database.query("pokemon"); return response.map((pokemon) => Pokemon.fromJson(pokemon)).toList(); } // Méthode qui permet de supprimer un Pokémon de la base de données static Future deletePokemon(int id) async { Database database = await getDatabase(); await database.delete("pokemon", where: "id = ?", whereArgs: [id]); } // Méthode qui permet de supprimer tous les pokémons de la base de données static Future deleteAllPokemon() async { Database database = await getDatabase(); await database.delete("pokemon"); } // Méthode qui permet de mettre à jour un Pokémon dans la base de données static Future updatePokemon(Pokemon pokemon) async { Database database = await getDatabase(); await database.update("pokemon", pokemon.toJson(), where: "id = ?", whereArgs: [pokemon.id]); onDatabaseUpdate.value++; } // Méthode qui permet de récupérer un Pokémon dans la base de données à partir de son ID static Future getPokemon(int id) async { Database database = await getDatabase(); List> pokemonList = await database.query("pokemon", where: "id = ?", whereArgs: [id]); if (pokemonList.isEmpty) { return null; } return Pokemon.fromJson(pokemonList.first); } // Obtenir le nombre de pokémon attrapés static Future getCaughtCount() async { Database database = await getDatabase(); var result = await database.rawQuery("SELECT COUNT(*) FROM pokemon WHERE isCaught = 1"); int count = result.isNotEmpty ? (result.first.values.first as int? ?? 0) : 0; return count; } }