// Path: src/main/java/com/nametagedit/plugin/api/data/GroupData.java
// @Data
// @AllArgsConstructor
// public class GroupData implements INametag {
// 
//     private String groupName;
//     private String prefix;
//     private String suffix;
//     private String permission;
//     private Permission bukkitPermission;
//     private int sortPriority;
// 
//     public GroupData() {
// 
//     }
// 
//     public void setPermission(String permission) {
//         this.permission = permission;
//         bukkitPermission = new Permission(permission, PermissionDefault.FALSE);
//     }
// 
//     @Override
//     public boolean isPlayerTag() {
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/com/nametagedit/plugin/storage/database/DatabaseConfig.java
// public class DatabaseConfig implements AbstractConfig {
// 
//     private NametagEdit plugin;
//     private NametagHandler handler;
//     private HikariDataSource hikari;
// 
//     // These are used if the user wants to customize the
//     // schema structure. Perhaps more cosmetic.
//     public static String TABLE_GROUPS;
//     public static String TABLE_PLAYERS;
//     public static String TABLE_CONFIG;
// 
//     public DatabaseConfig(NametagEdit plugin, NametagHandler handler, Configuration config) {
//         this.plugin = plugin;
//         this.handler = handler;
//         TABLE_GROUPS = "`" + config.getString("MySQL.GroupsTable", "nte_groups") + "`";
//         TABLE_PLAYERS = "`" + config.getString("MySQL.PlayersTable", "nte_players") + "`";
//         TABLE_CONFIG = "`" + config.getString("MySQL.ConfigTable", "nte_config") + "`";
//     }
// 
//     @Override
//     public void load() {
//         FileConfiguration config = handler.getConfig();
//         shutdown();
//         hikari = new HikariDataSource();
//         hikari.setMaximumPoolSize(config.getInt("MinimumPoolSize", 10));
//         hikari.setPoolName("NametagEdit Pool");
// 
//         String port = "3306";
// 
//         if (config.isSet("MySQL.Port")) {
//             port = config.getString("MySQL.Port");
//         }
// 
//         hikari.setJdbcUrl("jdbc:mysql://" + config.getString("MySQL.Hostname") + ":" + port + "/" + config.getString("MySQL.Database"));
//         hikari.addDataSourceProperty("useSSL", false);
//         hikari.addDataSourceProperty("requireSSL", false);
//         hikari.addDataSourceProperty("verifyServerCertificate", false);
//         hikari.addDataSourceProperty("user", config.getString("MySQL.Username"));
//         hikari.addDataSourceProperty("password", config.getString("MySQL.Password"));
// 
//         hikari.setUsername(config.getString("MySQL.Username"));
//         hikari.setPassword(config.getString("MySQL.Password"));
// 
//         new DatabaseUpdater(handler, hikari, plugin).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void reload() {
//         new DataDownloader(handler, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void shutdown() {
//         if (hikari != null) {
//             hikari.close();
//         }
//     }
// 
//     @Override
//     public void load(Player player, boolean loggedIn) {
//         new PlayerLoader(player.getUniqueId(), plugin, handler, hikari, loggedIn).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void save(PlayerData... playerData) {
//         new PlayerSaver(playerData, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void save(GroupData... groupData) {
//         new GroupSaver(groupData, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void savePriority(boolean playerTag, String key, final int priority) {
//         if (playerTag) {
//             UUIDFetcher.lookupUUID(key, plugin, uuid -> {
//                 if (uuid != null) {
//                     new PlayerPriority(uuid, priority, hikari).runTaskAsynchronously(plugin);
//                 } else {
//                     plugin.getLogger().severe("An error has occurred while looking for UUID.");
//                 }
//             });
//         } else {
//             new GroupPriority(key, priority, hikari).runTaskAsynchronously(plugin);
//         }
//     }
// 
//     @Override
//     public void delete(GroupData groupData) {
//         new GroupDeleter(groupData.getGroupName(), hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void add(GroupData groupData) {
//         new GroupAdd(groupData, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void clear(UUID uuid, String targetName) {
//         new PlayerDeleter(uuid, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void orderGroups(CommandSender commandSender, List<String> order) {
//         String formatted = Arrays.toString(order.toArray());
//         formatted = formatted.substring(1, formatted.length() - 1).replace(",", "");
//         new GroupConfigUpdater("order", formatted, hikari).runTaskAsynchronously(handler.getPlugin());
//     }
// 
// }


import com.nametagedit.plugin.api.data.GroupData;
import com.nametagedit.plugin.storage.database.DatabaseConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.AllArgsConstructor;
import org.bukkit.scheduler.BukkitRunnable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
package com.nametagedit.plugin.storage.database.tasks;



@AllArgsConstructor
public class GroupAdd extends BukkitRunnable {

// Path: src/main/java/com/nametagedit/plugin/api/data/GroupData.java
// @Data
// @AllArgsConstructor
// public class GroupData implements INametag {
// 
//     private String groupName;
//     private String prefix;
//     private String suffix;
//     private String permission;
//     private Permission bukkitPermission;
//     private int sortPriority;
// 
//     public GroupData() {
// 
//     }
// 
//     public void setPermission(String permission) {
//         this.permission = permission;
//         bukkitPermission = new Permission(permission, PermissionDefault.FALSE);
//     }
// 
//     @Override
//     public boolean isPlayerTag() {
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/com/nametagedit/plugin/storage/database/DatabaseConfig.java
// public class DatabaseConfig implements AbstractConfig {
// 
//     private NametagEdit plugin;
//     private NametagHandler handler;
//     private HikariDataSource hikari;
// 
//     // These are used if the user wants to customize the
//     // schema structure. Perhaps more cosmetic.
//     public static String TABLE_GROUPS;
//     public static String TABLE_PLAYERS;
//     public static String TABLE_CONFIG;
// 
//     public DatabaseConfig(NametagEdit plugin, NametagHandler handler, Configuration config) {
//         this.plugin = plugin;
//         this.handler = handler;
//         TABLE_GROUPS = "`" + config.getString("MySQL.GroupsTable", "nte_groups") + "`";
//         TABLE_PLAYERS = "`" + config.getString("MySQL.PlayersTable", "nte_players") + "`";
//         TABLE_CONFIG = "`" + config.getString("MySQL.ConfigTable", "nte_config") + "`";
//     }
// 
//     @Override
//     public void load() {
//         FileConfiguration config = handler.getConfig();
//         shutdown();
//         hikari = new HikariDataSource();
//         hikari.setMaximumPoolSize(config.getInt("MinimumPoolSize", 10));
//         hikari.setPoolName("NametagEdit Pool");
// 
//         String port = "3306";
// 
//         if (config.isSet("MySQL.Port")) {
//             port = config.getString("MySQL.Port");
//         }
// 
//         hikari.setJdbcUrl("jdbc:mysql://" + config.getString("MySQL.Hostname") + ":" + port + "/" + config.getString("MySQL.Database"));
//         hikari.addDataSourceProperty("useSSL", false);
//         hikari.addDataSourceProperty("requireSSL", false);
//         hikari.addDataSourceProperty("verifyServerCertificate", false);
//         hikari.addDataSourceProperty("user", config.getString("MySQL.Username"));
//         hikari.addDataSourceProperty("password", config.getString("MySQL.Password"));
// 
//         hikari.setUsername(config.getString("MySQL.Username"));
//         hikari.setPassword(config.getString("MySQL.Password"));
// 
//         new DatabaseUpdater(handler, hikari, plugin).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void reload() {
//         new DataDownloader(handler, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void shutdown() {
//         if (hikari != null) {
//             hikari.close();
//         }
//     }
// 
//     @Override
//     public void load(Player player, boolean loggedIn) {
//         new PlayerLoader(player.getUniqueId(), plugin, handler, hikari, loggedIn).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void save(PlayerData... playerData) {
//         new PlayerSaver(playerData, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void save(GroupData... groupData) {
//         new GroupSaver(groupData, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void savePriority(boolean playerTag, String key, final int priority) {
//         if (playerTag) {
//             UUIDFetcher.lookupUUID(key, plugin, uuid -> {
//                 if (uuid != null) {
//                     new PlayerPriority(uuid, priority, hikari).runTaskAsynchronously(plugin);
//                 } else {
//                     plugin.getLogger().severe("An error has occurred while looking for UUID.");
//                 }
//             });
//         } else {
//             new GroupPriority(key, priority, hikari).runTaskAsynchronously(plugin);
//         }
//     }
// 
//     @Override
//     public void delete(GroupData groupData) {
//         new GroupDeleter(groupData.getGroupName(), hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void add(GroupData groupData) {
//         new GroupAdd(groupData, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void clear(UUID uuid, String targetName) {
//         new PlayerDeleter(uuid, hikari).runTaskAsynchronously(plugin);
//     }
// 
//     @Override
//     public void orderGroups(CommandSender commandSender, List<String> order) {
//         String formatted = Arrays.toString(order.toArray());
//         formatted = formatted.substring(1, formatted.length() - 1).replace(",", "");
//         new GroupConfigUpdater("order", formatted, hikari).runTaskAsynchronously(handler.getPlugin());
//     }
// 
// }


// Path: src/main/java/com/nametagedit/plugin/storage/database/tasks/GroupAdd.java
import com.nametagedit.plugin.api.data.GroupData;
import com.nametagedit.plugin.storage.database.DatabaseConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.AllArgsConstructor;
import org.bukkit.scheduler.BukkitRunnable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

package com.nametagedit.plugin.storage.database.tasks;



@AllArgsConstructor
public class GroupAdd extends BukkitRunnable {

    private final GroupData groupData;