#pragma once


#include <vtkSmartPointer.h>
#include <vtkUnstructuredGrid.h>
#include <map>
#include <complex>

class nearToFarField
{
public:
	nearToFarField();

	//create sphere at center x_0 y_0 z_0
	vtkSmartPointer<vtkUnstructuredGrid> createSphere(double x_0, double y_0, double z_0, double r_sphere, int Ntheta, int Nphi);
	vtkSmartPointer<vtkUnstructuredGrid> createBox(double minx, double maxx, double miny, double maxy, double minz, double maxz, int Nx, int Ny, int Nz);

	std::vector<double> getBoundingBox(std::vector<vtkSmartPointer<vtkUnstructuredGrid>> gridList);

	std::vector<vtkSmartPointer<vtkUnstructuredGrid>> execute();


	std::vector<double> getFarField(std::vector<std::vector<std::complex<double>> > magneticCurrent, std::vector<std::vector<std::complex<double>> > electricCurrent,
		double k0, std::vector<double> angles, double radius, vtkSmartPointer<vtkUnstructuredGrid> sourceGridwithCellsData);

	vtkSmartPointer<vtkDataSet> getNearFieldData(std::vector<vtkSmartPointer<vtkUnstructuredGrid>> gridList);

	void setWaveNumber(double);
	void setFrequency(double);
	void setPath(std::string);
	void setSourceGrid(vtkSmartPointer<vtkUnstructuredGrid>);
	void addEnclosingGrid(vtkSmartPointer<vtkUnstructuredGrid>);
	double getRadiatedPower();
	void setFirstFreq(bool);
	void readConfig();
private:
	std::vector<double> phiValues;
	std::vector<double> thetaValues;
	double k0;
	double f0;
	double x_0, y_0, z_0;
	int Nphi, Ntheta;
	std::string path;
	vtkSmartPointer<vtkUnstructuredGrid> sourceGrid;
	std::vector<vtkSmartPointer<vtkUnstructuredGrid> > enclosingGrids;
	double radiated_power;
	bool isFirstFrequency;
	void writePlaneFields(vtkSmartPointer<vtkUnstructuredGrid> ugrid, std::string);

};