#pragma once

#include"../common/define.h"
#include"../common/util.h"
#include"../Eigen/Dense"

#define BF_INPUT int order, int numBF, double u, double v, double w, Eigen::Vector3d& o


void BF_Line_Lagrange(BF_INPUT);
void BF_Line_Grad_Lagrange(BF_INPUT);
void BF_Line_Curl_Lagrange(BF_INPUT);

void BF_Triangle_Lagrange(BF_INPUT);
void BF_Triangle_Grad_Lagrange(BF_INPUT);
void BF_Triangle_Curl_Lagrange(BF_INPUT);

void BF_Triangle_Nedelec(BF_INPUT);
void BF_Triangle_Curl_Nedelec(BF_INPUT);

void BF_Quadrangle_Lagrange(BF_INPUT);
void BF_Quadrangle_Grad_Lagrange(BF_INPUT);
void BF_Quadrangle_Curl_Lagrange(BF_INPUT);

void BF_Quadrangle_Nedelec(BF_INPUT);
void BF_Quadrangle_Curl_Nedelec(BF_INPUT);

void BF_Tetrahedron_Nedelec(BF_INPUT);
void BF_Tetrahedron_Curl_Nedelec(BF_INPUT);

void BF_Prism_Nedelec(BF_INPUT);
void BF_Prism_Curl_Nedelec(BF_INPUT);

class BF
{
public:
	int GetNbrBF(int dim, int type, int typeBF, int order);
	int GetNbrBF();
	void GetValueBF(int numBF, double u, double v, double w, Eigen::Vector3d& o);

private:
	int _mNbrBF = 0; //number of basis function
	int _mDim = 0; //geo dimension
	int _mGeoType = 0; //line tri quad tetrahedron prism
	int _mBFType = 0; //original grad curl
	int _mOrder = 1; //order of basis function
};