/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.gamestate.server;
import com.badlogic.gdx.files.FileHandle;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import com.happydroids.HappyDroidConsts;
import com.happydroids.droidtowers.gamestate.GameSave;
import com.happydroids.droidtowers.gamestate.GameSaveFactory;
import org.apach3.commons.codec.binary.Base64;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Date;
import java.util.List;
@SuppressWarnings("FieldCanBeLocal")
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class CloudGameSave extends TowerGameServiceObject {
protected String blob;
protected String image;
protected Date syncedOn;
protected int fileGeneration;
private List<String> neighbors;
private FriendCloudGameSaveCollection neighborGameSaves;
private boolean upgradedGameSave;
public CloudGameSave() {
neighborGameSaves = new FriendCloudGameSaveCollection();
}
public CloudGameSave(String resourceUri) {
this();
setResourceUri(resourceUri);
}
public CloudGameSave(GameSave gameSave, FileHandle pngFile) {
this();
try {
fileGeneration = gameSave.getFileGeneration();
setResourceUri(gameSave.getCloudSaveUri());
blob = getObjectMapper().writeValueAsString(gameSave);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String getBaseResourceUri() {
return HappyDroidConsts.HAPPYDROIDS_URI + "/api/v1/gamesave/";
}
@Override
protected boolean requireAuthentication() {
return true;
}
@JsonIgnore
public GameSave getGameSave() {
GameSave gameSave = GameSaveFactory.readFile(new ByteArrayInputStream(getBlob().getBytes()), "cloudGameSave_" + hashCode());
gameSave.setCloudSaveUri(getResourceUri());
return gameSave;
}
@JsonIgnore
public FriendCloudGameSaveCollection getNeighborGameSaves() {
return neighborGameSaves;
}
public List<String> getNeighbors() {
List<String> neighborUris = Lists.newArrayList();
if (neighborGameSaves != null) {
for (FriendCloudGameSave gameSave : neighborGameSaves.getObjects()) {
neighborUris.add(URI.create(gameSave.getResourceUri()).getPath());
}
}
return neighborUris;
}
public void setNeighbors(List<String> neighborUris) {
neighborGameSaves.clear();
for (String neighborUri : neighborUris) {
neighborGameSaves.add(new FriendCloudGameSave(neighborUri));
}
}
public GameSave getGameSaveMetadata() {
return GameSaveFactory.readMetadata(new ByteArrayInputStream(getBlob().getBytes()));
}
public int getFileGeneration() {
return fileGeneration;
}
public String getBlob() {
if (!upgradedGameSave) {
upgradedGameSave = true;
try {
blob = getObjectMapper().writeValueAsString(GameSaveFactory.upgradeGameSave(new ByteArrayInputStream(blob.getBytes()), null));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return blob;
}
@JsonIgnore
public boolean hasNeighbors() {
return ((neighbors != null) && !neighbors.isEmpty()) || ((neighborGameSaves != null) && !neighborGameSaves.isEmpty());
}
@JsonIgnore
public int numNeighbors() {
return getNeighbors().size();
}
public byte[] getImage() {
return Base64.decodeBase64(image);
}
public void updateImage(FileHandle pngFile) {
image = Base64.encodeBase64URLSafeString(pngFile.readBytes());
}
}