package de.fau.cs.mad.fly.profile;
import java.util.ArrayList;
import java.util.List;
import com.badlogic.gdx.sql.DatabaseCursor;
import de.fau.cs.mad.fly.I18n;
import de.fau.cs.mad.fly.HttpClient.PutUserHttpRespListener;
import de.fau.cs.mad.fly.HttpClient.PutUserService;
import de.fau.cs.mad.fly.db.FlyDBManager;
import de.fau.cs.mad.fly.settings.AppSettingsManager;
/**
* Manages the player profiles.
*
* @author Qufang Fan
*/
public class PlayerProfileManager {
private PlayerProfile currentPlayerProfile;
private List<PlayerProfile> playerProfiles;
private static PlayerProfileManager Instance = new PlayerProfileManager();
private List<ChangeListener<PlayerProfile>> playerProfileChangeListener;
public PlayerProfile getCurrentPlayerProfile() {
return currentPlayerProfile;
}
/**
* Sets the current player and saves them during the app is running in the
* {@link AppSettingsManager}. If the new {@link PlayerProfile} is an other
* profile than the current, it calls {@link #currentPlayerProfileChanged().
*/
public void setCurrentPlayer(PlayerProfile currentPlayerProfile) {
if (this.currentPlayerProfile != currentPlayerProfile) {
this.currentPlayerProfile = currentPlayerProfile;
AppSettingsManager.Instance.setIntegerSetting(AppSettingsManager.CHOSEN_USER, currentPlayerProfile.getId());
currentPlayerProfileChanged();
}
}
/**
* Adds a new {@link PlayerProfile} with the defined name and makes it the
* new {@link #currentPlayerProfile} with {@link #setCurrentPlayer(PlayerProfile)}.
*
* @param newPlayerProfileName
*/
public void addNewPlayerProfile(String newPlayerProfileName) {
PlayerProfile newPlayerProfile = new PlayerProfile();
newPlayerProfile.setName(newPlayerProfileName);
playerProfiles.add(newPlayerProfile);
addNewPlayerToDatabase(newPlayerProfile);
setCurrentPlayer(newPlayerProfile);
}
/** Calls every listener of the current {@link PlayerProfile} */
private void currentPlayerProfileChanged() {
for (int i = playerProfileChangeListener.size() - 1; i >= 0; i--) {
playerProfileChangeListener.get(i).changed(currentPlayerProfile);
}
}
/**
* Add a new listener, that is called whenever the current
* {@link PlayerProfile} is changed by
* {@link #setCurrentPlayer(PlayerProfile)}.
*
* @param listener
*/
public void addPlayerChangedListener(ChangeListener<PlayerProfile> listener) {
playerProfileChangeListener.add(listener);
}
/**
* Initializes the default player profile, creates the default player
* profile when there is no player already existing.
*/
private PlayerProfileManager() {
setPlayers();
playerProfileChangeListener = new ArrayList<ChangeListener<PlayerProfile>>();
int userID = AppSettingsManager.Instance.getIntegerSetting(AppSettingsManager.CHOSEN_USER, 0);
PlayerProfile player = getPlayerfromList(userID);
if (player == null) {
addNewPlayerProfile(I18n.t("default.playerName"));
}
else {
setCurrentPlayer(player);
}
}
public static PlayerProfileManager getInstance() {
return Instance;
}
private PlayerProfile getPlayerfromList(int userID) {
for (PlayerProfile player : playerProfiles) {
if (player.getId() == userID) {
return player;
}
}
return null;
}
public PlayerProfile getPlayerfromDB(int userID) {
final String selectSQL = "select player_id, fly_id,name from player where player_id =" + userID;
PlayerProfile playerProfile = null;
DatabaseCursor cursor = FlyDBManager.getInstance().selectData(selectSQL);
if (cursor != null && cursor.getCount() > 0) {
cursor.next();
playerProfile = new PlayerProfile();
playerProfile.setId(cursor.getInt(0));
playerProfile.setFlyID(cursor.getInt(1));
playerProfile.setName(cursor.getString(2));
cursor.close();
}
return playerProfile;
}
public List<PlayerProfile> getAllPlayerProfiles() {
return playerProfiles;
}
private void setPlayers() {
playerProfiles = new ArrayList<PlayerProfile>();
final String selectSQL = "select player_id,fly_id,name,total_score,total_geld,current_levelgroup_id,current_level_id,passed_levelgroup_id,passed_level_id,secret_key,is_newname_uploaded from player";
DatabaseCursor cursor = FlyDBManager.getInstance().selectData(selectSQL);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.next()) {
PlayerProfile playerProfile = new PlayerProfile();
playerProfile.setId(cursor.getInt(0));
playerProfile.setFlyID(cursor.getInt(1));
playerProfile.setName(cursor.getString(2));
playerProfile.setMoney(cursor.getInt(3));
playerProfile.setCurrentLevelGroup(LevelGroupManager.getInstance().getLevelGroup(cursor.getInt(5)));
playerProfile.setCurrentLevelProfile(cursor.getInt(6));
playerProfile.setPassedLevelgroupID(cursor.getInt(7));
playerProfile.setPassedLevelID(cursor.getInt(8));
playerProfile.setSecretKey(cursor.getString(9));
playerProfile.setNewnameUploaded(cursor.getInt(10)>0);
playerProfiles.add(playerProfile);
}
cursor.close();
}
}
private void addNewPlayerToDatabase(PlayerProfile playerProfile) {
int newID = getMaxPlayerID() + 1;
playerProfile.setId(newID);
final String insertSQL = "insert into player (player_id, name) values (" + playerProfile.getId() + " , '" + playerProfile.getName() + "')";
FlyDBManager.getInstance().execSQL(insertSQL);
}
private int getMaxPlayerID() {
final String selectSQL = "select max(player_id) from player";
DatabaseCursor cursor = FlyDBManager.getInstance().selectData(selectSQL);
if (cursor != null && cursor.getCount() > 0) {
cursor.next();
int ret = cursor.getInt(0);
cursor.close();
return ret;
}
return 0;
}
public void saveFlyID(PlayerProfile playerProfile) {
final String sql = "update player set fly_id=" + playerProfile.getFlyID() + " where player_id=" + playerProfile.getId();
FlyDBManager.getInstance().execSQL(sql);
}
public void saveSecretKey(PlayerProfile profile) {
final String sql = "update player set secret_key='" + profile.getSecretKey() + "' where player_id=" + profile.getId();
FlyDBManager.getInstance().execSQL(sql);
}
public void updateIntColumn(PlayerProfile playerProfile, String colname, int newValue) {
final String sql = "update player set " + colname + "=" + newValue + " where player_id=" + playerProfile.getId();
FlyDBManager.getInstance().execSQL(sql);
}
/**
* Changes the name of the current {@link PlayerProfile} to the defined
* name. In case it is a new name {@link #currentPlayerProfileChanged()} is
* called.
*
* @param newPlayerProfileName
*/
public void editCurrentPlayerName(String newPlayerProfileName) {
if (!currentPlayerProfile.getName().equals(newPlayerProfileName)) {
updateStringColumn(currentPlayerProfile, "name", newPlayerProfileName);
currentPlayerProfile.setName(newPlayerProfileName);
//change name on server
if(currentPlayerProfile.getFlyID() > 0 ){
updateIntColumn(currentPlayerProfile, "is_newname_uploaded", 0);
currentPlayerProfile.setNewnameUploaded(false);
new PutUserService( new PutUserHttpRespListener(currentPlayerProfile)).execute(currentPlayerProfile);
}
currentPlayerProfileChanged();
}
}
public void updateStringColumn(PlayerProfile playerProfile, String colname, String newValue) {
final String sql = "update player set " + colname + "='" + newValue + "' where player_id=" + playerProfile.getId();
FlyDBManager.getInstance().execSQL(sql);
}
public void deletePlayerProfile() {
this.deletePlayerProfile(this.getCurrentPlayerProfile());
}
public void deletePlayerProfile(PlayerProfile playerProfile) {
final String sql = "delete from player where player_id=" + playerProfile.getId();
final String sql1 = "delete from score where player_id=" + playerProfile.getId();
final String sql2 = "delete from fly_plane_Equiped where player_id=" + playerProfile.getId();
final String sql3 = "delete from fly_plane_upgrade where player_id=" + playerProfile.getId();
FlyDBManager.getInstance().execSQL(sql);
FlyDBManager.getInstance().execSQL(sql1);
FlyDBManager.getInstance().execSQL(sql2);
FlyDBManager.getInstance().execSQL(sql3);
if (playerProfile == this.getCurrentPlayerProfile()) {
this.getAllPlayerProfiles().remove(playerProfile);
playerProfile.clearSettingManager();
this.setCurrentPlayer(this.getAllPlayerProfiles().get(0));
} else {
this.getAllPlayerProfiles().remove(playerProfile);
playerProfile.clearSettingManager();
}
}
}