package org.openpixi.pixi.physics.movement.boundary;

import org.openpixi.pixi.physics.particles.Particle;
import org.openpixi.pixi.physics.util.DoubleBox;

/**
 * Determines the type of particle boundary.
 */
public enum ParticleBoundaryType {

	Hardwall {
		@Override
		public ParticleBoundary createBoundary(double xoffset, double yoffset) {
			return new HardwallBoundary(xoffset, yoffset);
		}

		@Override
		public DoubleBox getParticleBox(Particle p, DoubleBox pbb) {
			pbb.set(
					p.getX() - p.getRadius(), p.getX() + p.getRadius(),
					p.getY() - p.getRadius(), p.getY() + p.getRadius());
			return pbb;
		}
	},

	Periodic {
		@Override
		public ParticleBoundary createBoundary(double xoffset, double yoffset) {
			return new PeriodicBoundary(xoffset, yoffset);
		}

		@Override
		public DoubleBox getParticleBox(Particle p, DoubleBox pbb) {
			pbb.set(p.getX(), p.getX(), p.getY(), p.getY());
			return pbb;
		}
	};

	public abstract ParticleBoundary createBoundary(double xoffset, double yoffset);

	/**
	 * Determines a bounding box around the particle.
	 * For the determination of whether the particle is outside of the simulation area
	 * we can use the particle's bounding box.
	 */
	public abstract DoubleBox getParticleBox(Particle p, DoubleBox pbb);
}
