#pragma once

// [cart-sys3d.h]: 3D cartesian axis type
//
// -------------------------------------------------------------------------------------------- //

#include <string.h>

namespace nse
{
	namespace nse_const3d {
		enum axisType {
			axisX = 0, axisY = 1, axisZ = 2,
			axisXY = 3, axisXZ = 4, axisYZ = 5, axisXYZ = 6
		};
	}

	const char* axis_name(const nse_const3d::axisType axis);

	bool axis_value(nse_const3d::axisType *axis, const char* name);

	bool is_axis_1d(const nse_const3d::axisType axis);
	bool is_axis_2d(const nse_const3d::axisType axis);
	bool is_axis_3d(const nse_const3d::axisType axis);

	namespace nse_const3d {
		enum domainSideType {
			westSide = 0, eastSide = 1,
			southSide = 2, northSide = 3,
			bottomSide = 4, topSide = 5
		};
	}
}

// Implementation:
// -------------------------------------------------------------------------------------------- //
inline const char* nse::axis_name(const nse_const3d::axisType axis) {
	if (axis == nse_const3d::axisX) return "X";
	if (axis == nse_const3d::axisY) return "Y";
	if (axis == nse_const3d::axisZ) return "Z";
	if (axis == nse_const3d::axisXY) return "XY";
	if (axis == nse_const3d::axisXZ) return "XZ";
	if (axis == nse_const3d::axisYZ) return "YZ";
	if (axis == nse_const3d::axisXYZ) return "XYZ";
	return "UNDEF";
}

inline bool nse::axis_value(nse_const3d::axisType *axis, const char* name) 
{
	if (!strcmp(name, axis_name(nse_const3d::axisX))) {
		(*axis) = nse_const3d::axisX;
		return true;
	}
	if (!strcmp(name, axis_name(nse_const3d::axisY))) {
		(*axis) = nse_const3d::axisY;
		return true;
	}
	if (!strcmp(name, axis_name(nse_const3d::axisZ))) {
		(*axis) = nse_const3d::axisZ;
		return true;
	}
	if (!strcmp(name, axis_name(nse_const3d::axisXY))) {
		(*axis) = nse_const3d::axisXY;
		return true;
	}
	if (!strcmp(name, axis_name(nse_const3d::axisXZ))) {
		(*axis) = nse_const3d::axisXZ;
		return true;
	}
	if (!strcmp(name, axis_name(nse_const3d::axisYZ))) {
		(*axis) = nse_const3d::axisYZ;
		return true;
	}
	if (!strcmp(name, axis_name(nse_const3d::axisXYZ))) {
		(*axis) = nse_const3d::axisXYZ;
		return true;
	}

	return false;
}

inline bool nse::is_axis_1d(const nse_const3d::axisType axis)
{
	return ((axis == nse_const3d::axisX) ||
		(axis == nse_const3d::axisY) || (axis == nse_const3d::axisZ));
}

inline bool nse::is_axis_2d(const nse_const3d::axisType axis)
{
	return ((axis == nse_const3d::axisXY) ||
		(axis == nse_const3d::axisXZ) || (axis == nse_const3d::axisYZ));
}

inline bool nse::is_axis_3d(const nse_const3d::axisType axis)
{
	return (axis == nse_const3d::axisXYZ);
}