#ifndef BOX_HPP
#define BOX_HPP

#include <vector>
#include "Body.hpp"

namespace nbody {
	using namespace std;

	class Box {
		friend class Node;
		friend class MpiSimulation;
	private:
		double min[3];
		double max[3];
	public:
		Box();
		virtual ~Box();
		virtual void extendToCube();
		virtual void extendForBodies(vector<Body> bodies);
		virtual double getMin(int index);
		virtual double getMax(int index);
		virtual void setMin(int index, double value);
		virtual void setMax(int index, double value);
		virtual vector<Body> extractBodies(vector<Body>& bodies);
		virtual vector<Body> copyBodies(vector<Body> bodies);
		virtual bool isContained(Body body);
		virtual bool isContained(Box box);
		virtual double volume();
		virtual double maxSidelength();
		virtual bool isCorrect();
		virtual bool isValid();
		virtual void print();
		virtual bool overlapsSphere(double* sphereCenter, double sphereRadius);
		virtual double distanceToPosition(double* position);
		virtual double distanceToBox(Box box);
		virtual vector<Box> octreeSplit();
		virtual vector<Box> splitLongestSide();
		virtual bool contained(double* position);
		virtual void extend(Box extender);
		virtual void extend(Body extender);
	};
}

#endif