#pragma once

#include<string>
#include<complex>
#include"../Eigen/Dense"
#include"../common/define.h"

using namespace std;


class Material
{
public:
	Material();
	~Material();

	void SetName(string name);
	void SetDomain(int nbrDomain,int domain[]);
	void SetEpsr(complex<double> value);
	void SetEpsr(complex<double> value1, complex<double> value2, complex<double> value3);
	void SetMur(complex<double> value);
	void SetMur(complex<double> value1, complex<double> value2, complex<double> value3);
	void SetSimga(double value);
	void SetSimga(double value1, double value2, double value3);
	void SetChihe(complex<double> value1, complex<double> value2, complex<double> value3);
	void SetChieh(complex<double> value1, complex<double> value2, complex<double> value3);
	void SetNK(double n,double k);

	string GetName();
	bool IsContainDomain(int domainTag);
	Eigen::Matrix3cd GetEpsr();
	Eigen::Matrix3cd GetMur();
	Eigen::Matrix3d GetSigma();
	Eigen::Matrix3cd GetChihe();
	Eigen::Matrix3cd GetChieh();
	double GetN();
	double GetK();

	bool IsReal();

private:
	string _mName = "null";//材料名
	int _mNbrDomain = 0;//区域数目
	int* _mDomain = NULL;//区域
	
	Eigen::Matrix3cd _mEpsr;//相对介电常数
	Eigen::Matrix3cd _mMur;//相对磁导率
	Eigen::Matrix3d _mSigma;//电导率
	Eigen::Matrix3cd _mChihe;//磁电耦合常数chi_he
	Eigen::Matrix3cd _mChieh;//磁电耦合常数chi_eh
	double _mN;//折射率实部
	double _mK;//折射率虚部
};

class MaterialLib
{
public:
	~MaterialLib();

	void GetMat();

	Eigen::Matrix3cd GetEpsr(int domain);
	Eigen::Matrix3cd GetMur(int domain);
	Eigen::Matrix3d GetSigma(int domain);
	Eigen::Matrix3cd GetChihe(int domain);
	Eigen::Matrix3cd GetChieh(int domain);
	double GetN(int domain);
	double GetK(int domain);

	bool IsReal();

	void Test_ReadData(string str);
private:
	void SetNumberMat(int number);
	void SetMat(int num, string name, int nbrDomain, int* domain, int matType, complex<double>* epsr,
		complex<double>* mur, double* sigma, complex<double>* chihe, complex<double>* chieh);
	void SetMat(int num, string name, int nbrDomain, int domain[], int matType, double n, double k);
	int GetNumberMat(int domain);

	int _mNbrMat = 0; //材料数目 
	Material* _mMat = NULL; //材料
};


