package polly.rx.core.orion.model;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import polly.rx.core.orion.QuadrantUtils;
import de.skuzzle.polly.tools.Check;
import de.skuzzle.polly.tools.EqualsHelper;
import de.skuzzle.polly.tools.Equatable;
public class DefaultQuadrant implements Quadrant {
private final Map<String, DefaultSector> sectors;
private final String name;
private final int maxX;
private final int maxY;
public DefaultQuadrant(String name, int maxX, int maxY,
Map<String, ? extends Sector> sectorMap) {
this(name, maxX, maxY, sectorMap.values());
}
public DefaultQuadrant(String name, int maxX, int maxY,
Collection<? extends Sector> sectors) {
Check.objects(name, sectors).notNull()
.andInts(maxX, maxY).isPositiveOrZero();
this.name = name;
this.maxX = maxX;
this.maxY = maxY;
final Map<String, DefaultSector> m = new HashMap<>(sectors.size());
for (final Sector s : sectors) {
m.put(QuadrantUtils.createMapKey(s), new DefaultSector(s));
}
this.sectors = Collections.unmodifiableMap(m);
}
public DefaultQuadrant(Quadrant q) {
this(q.getName(), q.getMaxX(), q.getMaxY(), q.getSectors());
}
@Override
public String toString() {
return OrionObjectUtil.quadrantString(this);
}
@Override
public int hashCode() {
return OrionObjectUtil.quadrantHash(this);
}
@Override
public final boolean equals(Object obj) {
return EqualsHelper.testEquality(this, obj);
}
@Override
public Class<?> getEquivalenceClass() {
return Quadrant.class;
}
@Override
public boolean actualEquals(Equatable o) {
return OrionObjectUtil.quadrantsEquals(this, (Quadrant) o);
}
@Override
public String getName() {
return this.name;
}
@Override
public Sector getSector(int x, int y) {
final Sector s = this.sectors.get(QuadrantUtils.createMapKey(x, y));
if (s == null) {
return new DefaultSector(this.name, x, y, 0, 0, 0, SectorType.NONE,
Collections.<Production> emptyList());
}
return s;
}
@Override
public Collection<? extends Sector> getSectors() {
return this.sectors.values();
}
@Override
public int getMaxX() {
return this.maxX;
}
@Override
public int getMaxY() {
return this.maxY;
}
}