package server;
import database.DatabaseConnection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Map;
import handling.world.exped.ExpeditionType;
import tools.Pair;
import tools.Triple;
import tools.StringUtil;
public class SpeedRunner {
private static final Map<ExpeditionType, Triple<String, Map<Integer, String>, Long>> speedRunData = new EnumMap<>(ExpeditionType.class);
public final static Triple<String, Map<Integer, String>, Long> getSpeedRunData(ExpeditionType type) {
return speedRunData.get(type);
}
public final static void addSpeedRunData(ExpeditionType type, Pair<StringBuilder, Map<Integer, String>> mib, long tmp) {
speedRunData.put(type, new Triple<>(mib.getLeft().toString(), mib.getRight(), tmp));
}
public final static void removeSpeedRunData(ExpeditionType type) {
speedRunData.remove(type);
}
public final static void loadSpeedRuns() {
if (speedRunData.size() > 0) {
return;
}
for (ExpeditionType type : ExpeditionType.values()) {
loadSpeedRunData(type);
}
}
public final static String getPreamble(ExpeditionType type) {
return "#rThese are the speedrun times for " + StringUtil.makeEnumHumanReadable(type.name()).toUpperCase() + ".#k\r\n\r\n";
}
public final static void loadSpeedRunData(ExpeditionType type) {
try {
StringBuilder ret; //or should we do less
Map<Integer, String> rett;
boolean changed;
long tmp;
try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT * FROM speedruns WHERE type = ? ORDER BY time LIMIT 25")) {
ps.setString(1, type.name());
ret = new StringBuilder(getPreamble(type));
rett = new LinkedHashMap<>();
try (ResultSet rs = ps.executeQuery()) {
int rank = 1;
Set<String> leaders = new HashSet<>();
boolean cont = rs.first();
changed = cont;
tmp = 0;
while (cont) {
if (!leaders.contains(rs.getString("leader"))) {
addSpeedRunData(ret, rett, rs.getString("members"), rs.getString("leader"), rank, rs.getString("timestring"));
rank++;
leaders.add(rs.getString("leader"));
tmp = rs.getLong("time");
}
cont = rs.next() && rank < 25;
}
}
}
if (changed) {
speedRunData.put(type, new Triple<>(ret.toString(), rett, tmp));
}
} catch (SQLException e) {
}
}
public final static Pair<StringBuilder, Map<Integer, String>> addSpeedRunData(StringBuilder ret, Map<Integer, String> rett, String members, String leader, int rank, String timestring) {
StringBuilder rettt = new StringBuilder();
String[] membrz = members.split(",");
rettt.append("#bThese are the squad members of ").append(leader).append("'s squad at rank ").append(rank).append(".#k\r\n\r\n");
for (int i = 0; i < membrz.length; i++) {
rettt.append("#r#e");
rettt.append(i + 1);
rettt.append(".#n ");
rettt.append(membrz[i]);
rettt.append("#k\r\n");
}
rett.put(rank, rettt.toString());
ret.append("#b#L").append(rank).append("#Rank #e").append(rank).append("#n#k : ").append(leader).append(", in ").append(timestring);
if (membrz.length > 1) {
ret.append("#l");
}
ret.append("\r\n");
return new Pair<>(ret, rett);
}
}