package beans.core.db;
import beans.enumeration.Classe;
import beans.enumeration.Element;
import beans.enumeration.Stat;
import beans.enumeration.Type;
import beans.serializable.ChangeStatut;
import beans.serializable.Objet;
import beans.serializable.Skill;
import beans.serializable.Spell;
import beans.serializable.StatsPerso;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author mastersnes
*/
public class PersoControl {
public static final String PERSO_OBJET = "PERSO_OBJET";
public static final String PERSO_ABILITY = "PERSO_ABILITY";
public static final String PERSO_NAME = "nomPerso";
private final String CHARISMA = "charisma";
private final String CONSTITUTION = "constitution";
private final String DEXTERITY = "dexterity";
private final String HPMAXMODIFIER = "hpMaxModifier";
private final String STRENGTH = "strength";
private final String WISDOM = "wisdom";
private final String CLASSE = "classe";
private final String TABLE_NAME = "PERSO";
public StatsPerso getPerso(final String key) {
// Stats retournés
StatsPerso perso = new StatsPerso();
retreiveComp(key, perso);
PreparedStatement statement = null;
try {
// Préparer la requête
statement = Database.getStatement("select * from " + TABLE_NAME + " where " + PERSO_NAME + " = ?");
statement.setString(1, key);
// Exécuter la requête
ResultSet set = statement.executeQuery();
// Récupérer la première ligne
if (set.next()){
getFromRowSet(set, perso);
}
// En cas d'erreur
else{
// Retourner une erreur dans les logs
Logger.getLogger(ObjetControl.class.getName()).log(Level.SEVERE, null, new Exception(key + " not found in DB"));
}
} catch (final SQLException ex) {
Logger.getLogger(ObjetControl.class.getName()).log(Level.SEVERE, null, ex);
} finally {
closeProperly(statement);
}
return perso;
}
private void retreiveComp(final String key, final StatsPerso perso) {
PersoJunctionControl persoJunctionControl = new PersoJunctionControl(PERSO_ABILITY);
final List<String> idSpells = persoJunctionControl.getJunction(key);
final List<Spell> spells = new ArrayList<Spell>();
for (final String s : idSpells) {
final SpellControl spellControl = new SpellControl();
spells.add(spellControl.getSpell(s));
}
persoJunctionControl = new PersoJunctionControl(PERSO_ABILITY);
final List<String> idSkills = persoJunctionControl.getJunction(key);
final List<Skill> skills = new ArrayList<Skill>();
for (final String s : idSkills) {
final SkillControl skillControl = new SkillControl();
skills.add(skillControl.getSkill(s));
}
persoJunctionControl = new PersoJunctionControl(PERSO_OBJET);
final Map<String, Integer> idObjets = persoJunctionControl.getObjetJunction(key);
final Map<Objet, Integer> objets = new HashMap<Objet, Integer>();
for (final Entry<String, Integer> s : idObjets.entrySet()) {
final ObjetControl objetControl = new ObjetControl();
objets.put(objetControl.getObjet(s.getKey()), s.getValue());
}
perso.setSpells(spells);
perso.setSkills(skills);
perso.setObjets(objets);
}
private void closeProperly(final Statement statement) {
if (statement != null) {
try {
statement.close();
} catch (final SQLException ex) {
Logger.getLogger(PersoControl.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void getFromRowSet(final ResultSet set, final StatsPerso perso) {
try {
perso.setName(set.getString(PERSO_NAME));
perso.setCharisma(set.getInt(CHARISMA));
perso.setConstitution(set.getInt(CONSTITUTION));
perso.setDexterity(set.getInt(DEXTERITY));
perso.setHpMaxModifier(set.getInt(HPMAXMODIFIER));
perso.setStrength(set.getInt(STRENGTH));
perso.setWisdom(set.getInt(WISDOM));
perso.setClasse(Classe.valueOf(set.getString(CLASSE)));
} catch (final SQLException ex) {
Logger.getLogger(PersoControl.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void saveChangeStatut(final StatsPerso perso) {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = Database.getStatement("insert into " + TABLE_NAME + " values (?, ?, ?, ?, ?, ?, ?, ?)");
statement.setString(1, perso.getName());
statement.setInt(2, perso.getCharisma());
statement.setInt(3, perso.getConstitution());
statement.setInt(4, perso.getDexterity());
statement.setInt(5, perso.getHpMaxModifier());
statement.setInt(6, perso.getStrength());
statement.setInt(7, perso.getWisdom());
statement.setString(8, perso.getClasse().name());
statement.executeUpdate();
saveJunction(perso);
} catch (final SQLException ex) {
Logger.getLogger(ObjetControl.class.getName()).log(Level.SEVERE, null, ex);
} finally {
closeProperly(statement);
}
}
private void saveJunction(final StatsPerso perso) {
PersoJunctionControl persoJunctionControl = new PersoJunctionControl(PERSO_ABILITY);
for (final Spell spell : perso.getSpells()) {
persoJunctionControl.saveJunction(perso.getName(), spell.getName());
}
persoJunctionControl = new PersoJunctionControl(PERSO_ABILITY);
for (final Skill skill : perso.getSkills()) {
persoJunctionControl.saveJunction(perso.getName(), skill.getName());
}
persoJunctionControl = new PersoJunctionControl(PERSO_OBJET);
for (final Entry<Objet, Integer> entry : perso.getObjets().entrySet()) {
final Objet objet = entry.getKey();
final int nombre = entry.getValue();
persoJunctionControl.saveJunction(perso.getName(), objet.getName(), nombre);
}
}
}