package in.twizmwaz.cardinal.module.modules.regions.type.modifications;
import in.twizmwaz.cardinal.module.ModuleCollection;
import in.twizmwaz.cardinal.module.modules.regions.RegionModule;
import in.twizmwaz.cardinal.module.modules.regions.parsers.modifiers.TranslateParser;
import in.twizmwaz.cardinal.module.modules.regions.type.*;
import in.twizmwaz.cardinal.module.modules.regions.type.combinations.ComplementRegion;
import in.twizmwaz.cardinal.module.modules.regions.type.combinations.IntersectRegion;
import in.twizmwaz.cardinal.module.modules.regions.type.combinations.NegativeRegion;
import in.twizmwaz.cardinal.module.modules.regions.type.combinations.UnionRegion;
import org.bukkit.block.Block;
import org.bukkit.util.Vector;
import java.util.List;
public class TranslatedRegion extends RegionModule {
private final Vector offset;
private final RegionModule region;
public TranslatedRegion(String name, RegionModule base, Vector offset) {
super(name);
this.offset = offset;
this.region = translateRegion(base);
}
public TranslatedRegion(String name, RegionModule region) {
super(name);
this.offset = null;
this.region = region;
}
public TranslatedRegion(TranslateParser parser) {
this(parser.getName(), parser.getBase(), parser.getOffset());
}
public double getXOffset() {
return offset.getX();
}
public double getYOffset() {
return offset.getY();
}
public double getZOffset() {
return offset.getZ();
}
public RegionModule getRegion() {
return region;
}
@Override
public boolean contains(Vector vector) {
return region.contains(vector);
}
@Override
public PointRegion getRandomPoint() {
return region.getRandomPoint();
}
@Override
public BlockRegion getCenterBlock() {
return region.getCenterBlock();
}
@Override
public List<Block> getBlocks() {
return region.getBlocks();
}
@SuppressWarnings({"unchecked"})
private <T extends RegionModule> T translateRegion(T region) {
double x = getXOffset();
double y = getYOffset();
double z = getZOffset();
if (region instanceof PointRegion) {
PointRegion rg = (PointRegion) region;
return (T) new PointRegion(null, rg.getX() + x, rg.getY() + y, rg.getZ() + z);
} else if (region instanceof BlockRegion) {
BlockRegion rg = (BlockRegion) region;
return (T) new BlockRegion(null, rg.getX() + x, rg.getY() + y, rg.getZ() + z);
} else if (region instanceof CircleRegion) {
CircleRegion rg = (CircleRegion) region;
return (T) new CircleRegion(null, rg.getBaseX() + x, rg.getBaseZ() + z, rg.getRadius());
} else if (region instanceof CylinderRegion) {
CylinderRegion rg = (CylinderRegion) region;
return (T) new CylinderRegion(null, new Vector(rg.getBaseX() + x, rg.getBaseY() + y, rg.getBaseZ() + z), rg.getRadius(), rg.getHeight());
} else if (region instanceof RectangleRegion) {
RectangleRegion rg = (RectangleRegion) region;
return (T) new RectangleRegion(null, rg.getXMin() + x, rg.getZMin() + z, rg.getXMax() + x, rg.getZMax() + z);
} else if (region instanceof CuboidRegion) {
CuboidRegion rg = (CuboidRegion) region;
return (T) new CuboidRegion(null, rg.getXMin() + x, rg.getYMin() + y, rg.getZMin() + z, rg.getXMax() + x, rg.getYMax() + y, rg.getZMax() + z);
} else if (region instanceof SphereRegion) {
SphereRegion rg = (SphereRegion) region;
return (T) new SphereRegion(null, new Vector(rg.getOriginX() + x, rg.getOriginY() + y, rg.getOriginZ() + z), rg.getRadius());
} else if (region instanceof EmptyRegion) {
return (T) new EmptyRegion("");
} else if (region instanceof ComplementRegion) {
ComplementRegion rg = (ComplementRegion) region;
ModuleCollection<RegionModule> regions = new ModuleCollection<>();
for (RegionModule rg1 : rg.getRegions()) {
regions.add(translateRegion(rg1));
}
return (T) new ComplementRegion(null, regions);
} else if (region instanceof IntersectRegion) {
IntersectRegion rg = (IntersectRegion) region;
ModuleCollection<RegionModule> regions = new ModuleCollection<>();
for (RegionModule rg1 : rg.getRegions()) {
regions.add(translateRegion(rg1));
}
return (T) new IntersectRegion(null, regions);
} else if (region instanceof NegativeRegion) {
NegativeRegion rg = (NegativeRegion) region;
ModuleCollection<RegionModule> regions = new ModuleCollection<>();
for (RegionModule rg1 : rg.getRegions()) {
regions.add(translateRegion(rg1));
}
return (T) new NegativeRegion(null, regions);
} else if (region instanceof UnionRegion) {
UnionRegion rg = (UnionRegion) region;
ModuleCollection<RegionModule> regions = new ModuleCollection<>();
for (RegionModule rg1 : rg.getRegions()) {
regions.add(translateRegion(rg1));
}
return (T) new UnionRegion(null, regions);
} else if (region instanceof TranslatedRegion) {
TranslatedRegion rg = (TranslatedRegion) region;
return (T) new TranslatedRegion(null, translateRegion(rg.getRegion()));
} else if (region instanceof MirroredRegion) {
MirroredRegion rg = (MirroredRegion) region;
return (T) new MirroredRegion(null, translateRegion(rg.getRegion()));
}
return null;
}
}