package cactusServer.entities;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import cactusServer.entities.Entity;
import cactusServer.entities.Object;
import cactusServer.entities.Area.Allowed;
import cactusServer.entities.Object.Attribute;
import cactusServer.models.Instances;
import cactusServer.utils.RandomStringGenerator;
import cactusServer.entities.Character;
import framework.model3D.Position3D;
import framework.physics.AngularVelocity3D;
import framework.physics.Velocity3D;
import net.arnx.jsonic.JSONHint;
/**
* インスタンス
* @author ryo isitani
*
*/
public class Instance extends Entity {
private String name;
private State state;
private StageModel stage;
private HashMap<String, Area> areaMap = new HashMap<>();
private HashMap<String, Object> objMap = new HashMap<>();
private HashMap<String, Character> characterMap = new HashMap<>();
private static final int UNIQUE_ID_LENGTH = 12;
private Instance() {
// JSONDecode時の呼び出し用
}
/**
* (引数は現時点での仮のもの)
* @param name インスタンス名
*/
public Instance(String name, State state, StageModel stageModel) {
setName(name);
setState(state);
setStage(stageModel);
}
/**
* InstancesRestとのエラー解消用 (後で消す)
* @param name
* @param state
*/
public Instance(String name, State state) {
this.name = name;
this.state = state;
}
/**
* InstancesRestとのエラー解消用 (後で消す)
* @param name
*/
public Instance(String name) {
this.name = name;
this.state = State.AVAILABLE;
}
public String getName() {
return name;
}
public State getState() {
return state;
}
public StageModel getStage() {
return stage;
}
@JSONHint(ignore = true)
public Set<String> getAreaIdSet() {
return areaMap.keySet();
}
public Area getArea(String areaId) {
return areaMap.get(areaId);
}
@JSONHint(ignore = true)
public Set<String> getObjIdSet() {
return objMap.keySet();
}
public Object getObject(String objId) {
return objMap.get(objId);
}
// @JSONHint(ignore = true)
// public List<Character> getActiveCharacters() {
// List<Character> activeCharacterList = new ArrayList<>();
// for (Map.Entry<String, Character> entry : characterMap.entrySet()) {
// Character character = entry.getValue();
// if (character.isActive()) {
// activeCharacterList.add(character);
// }
// }
// return activeCharacterList;
// }
// public List<Character> getCharacters(String accountUniqueId) {
// List<Character> accountCharacterList = new ArrayList<>();
// for (Map.Entry<String, Character> entry : characterMap.entrySet()) {
// Character character = entry.getValue();
// URI accountURI = character.getAccountURI();
// if (accountUniqueId.equals("")) {
// // if文の条件にはaccountURIに含まれるaccountIdと引数のidとの照合が入る
// accountCharacterList.add(character);
// }
// }
// return accountCharacterList;
// }
public Character getCharacter(String characterId) {
return characterMap.get(characterId);
}
public void setName(String name) {
this.name = name;
}
public void setState(State state) {
this.state = state;
}
public void setStage(StageModel stage) {
this.stage = stage;
}
public AddressedEntity createArea(String name, Plain[] region, HashSet<Allowed> permissions) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet());
Area area = new Area(name, region, permissions);
areaMap.put(id, area);
return new IDAddressedEntity(id, area);
}
public AddressedEntity createObject(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Angle angle, Attribute attribute, ObjectModel model) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet());
Object object = new Object(position, velocity, angularVelocity, angle, attribute, model);
objMap.put(id, object);
return new IDAddressedEntity(id, object);
}
public AddressedEntity createCharacter(String accountURI, String name, Position3D position, Angle angle, CharacterModel model) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet());
// String characterURI = (INSTANCE_URI + "/characters/" + id);
Character character = new Character(accountURI, name, position, angle, model);
characterMap.put(id, character);
return new IDAddressedEntity(id, character);
}
public Character updateCharacter(String characterId, Position3D position, Angle angle, CharacterModel model) {
Character character = characterMap.get(characterId);
character.setPosition(position);
character.setAngle(angle);
character.setModel(model);
return character;
}
public Character destroyCharacter(String characterId) {
return characterMap.remove(characterId);
}
public Area destroyArea(String areaId) {
return areaMap.remove(areaId);
}
public Object destroyObject(String objId) {
return objMap.remove(objId);
}
public static enum State {
AVAILABLE, MAINTENANCE;
}
}