#pragma once
/*
*  FEKO_SIMULAION_SAR_CLASS 是适配FEKO成像算法
*  FEKOSimulationSARClass
*
*/
#ifndef FEKO_SIMULATION_SAR_CLASS_H
#define FEKO_SIMULATION_SAR_CLASS_H

#include "referenceHeader.h"
#include "OCCTBase.h"
#include "BaseToollib/GeoOperator.h"
#include "SARImage/FEKOBaseToolClass.h"
#include "SARBaseToolLib/SARImageBase.h"
 
#include <QObject>

namespace FEKOBase {

	//==========================================================
	// FEKO成像仿真参数类 
	//==========================================================
	class FEKOSimulationDataparams:public QObject
	{ // 仿真参数类
		Q_OBJECT

	public:
		FEKOSimulationDataparams(QObject* parent=nullptr);
		~FEKOSimulationDataparams();
 
	signals:
		void FEKOSimulationDataparamsChanged(); //  响应时间，作为一个参数分发
	
	public: // 频率更新
		void CalFEKOSimulationFreqParams(double centerFreq, double resolution, double bandWidth, double scenceRange, bool isResolution = false);
		void updateFEKOSimulationFreqParams(double startfreq, double endfreq, size_t freqpoints);  


	public:
		void  loadXml(const QString& fileName);
		void  saveXml(const QString& fileName);
 

	public: // 属性字段
		QString taskName; // 任务名称
		FEKOImageMode imagemode; // 成像时间
		QString AntennaRadiationFileName; // 远程天线等效辐射方向图文件地址
		long farsource_thetaPoints;
		long farsource_phiPoints;


		bool isRight = false; // 是否为右视
		double refRange;// 参考距离 m
		double incangle; // 入射角 °

		double centerFreq; // 中心频率
		double rangeResolution;//分辨率
		double bandwidth;// 带宽

		double startfreq; // 频率参数
		double endfreq;
		double freqpoints;


		//成像场景设置
		double x_min;
		double x_max;
		double y_min;
		double y_max;
		double z_plane;

		size_t imageheight; // 图像高度
		size_t imagewidth; // 图像宽度

		// 条带模式参数
		size_t prfcount; // 脉冲数量
		double start_x;
		double end_x;
		double start_y;
		double end_y;
		double start_z;
		double end_z;

		// 扫描模式参数
		double start_az_angle; // 扫描起始角
		double end_az_angle; // 扫描终止角


		// ISAR模式参数 , 圆迹模式参数
		double start_circle_angle; // 起始扫描角
		double end_circle_angle; // 终止扫描角
		double delta_angle;// 扫描角间隔

	public: 
		void setTaskName(QString taskName);
		QString getTaskName();
		// 成像模式
		void setImagemode(FEKOImageMode imagemode);
		FEKOImageMode getImagemode();
		// 是否为右视
		void setIsRight(bool isRight);
		bool getIsRight();
		// 参考距离
		void setRefRange(double refRange);
		double getRefRange();
		// 入射角
		void setIncangle(double incangle);
		double getIncangle();
		// 中心频率
		void setCenterFreq(double centerFreq);
		double getCenterFreq();
		// 分辨率
		void setRangeResolution(double rangeResolution);
		double getRangeResolution();
		// 带宽
		void setBandwidth(double bandwidth);
		double getBandwidth();
		// 频率参数
		void setStartfreq(double startfreq);
		double getStartfreq();
		void setEndfreq(double endfreq);
		double getEndfreq();
		void setFreqpoints(double freqpoints);
		double getFreqpoints();
		// 成像范围
		void setX_min(double x_min);
		double getX_min();
		void setX_max(double x_max);
		double getX_max();
		void setY_min(double y_min);
		double getY_min();
		void setY_max(double y_max);
		double getY_max();
		void setZ_plane(double z_plane);
		double getZ_plane();
		// 图像高度
		void setImageheight(size_t imageheight);
		size_t getImageheight();
		// 图像宽度
		void setImagewidth(size_t imagewidth);
		size_t getImagewidth();
		// 条带模式参数
		void setPRFCount(size_t prfcount);
		size_t getPRFCount();
		void setStart_x(double start_x);
		double getStart_x();
		void setEnd_x(double end_x);
		double getEnd_x();
		void setStart_y(double start_y);
		double getStart_y();
		void setEnd_y(double end_y);
		double getEnd_y();
		void setStart_z(double start_z);
		double getStart_z();
		void setEnd_z(double end_z);
		double getEnd_z();
		double getStart_az_angle(); // 扫描起始角
		double getEnd_az_angle(); // 扫描终止角
		double getStart_circle_angle(); // 起始扫描角
		double getEnd_circle_angle(); // 终止扫描角
		double getDelta_angle();// 扫描角间隔

		void setStart_az_angle(double Start_az_angle); // 扫描起始角
		void setEnd_az_angle(double End_az_angle); // 扫描终止角
		void setStart_circle_angle(double Start_circle_angle); // 起始扫描角
		void setEnd_circle_angle(double End_circle_angle); // 终止扫描角
		void setDelta_angle(double Delta_angle);// 扫描角间隔

		QString getAntennaRadiationFileName();
		void setAntennaRadiationFileName( QString  path);
		long getFarsourceThetaPoints();
		void setFarsourceThetaPoints(long thetaPoints);
		long getFarsourcePhiPoints();
		void setFarsourcePhiPoints(long phiPoints);

	};

	class FEKOSimulationDataparamsHandler {
		 
	public:
		FEKOSimulationDataparamsHandler();
		~FEKOSimulationDataparamsHandler();
	public:
		std::shared_ptr<FEKOBase::FEKOSimulationDataparams> simulationparams;
		void setFEKOSimulationDataparams(std::shared_ptr<FEKOBase::FEKOSimulationDataparams> simulationparams);
		std::shared_ptr<FEKOBase::FEKOSimulationDataparams> getFEKOSimulationDataparams();

	public:
		virtual void bandingsetFEKOSimulationDataparams();
	};

	//==========================================================
	// FEKO仿真成像参数类   
	// 解析成像参数xml
	//==========================================================
	class FEKOSimulationSARClass  : public FEKOSimulationDataparamsHandler
	{
	public:
		 FEKOSimulationSARClass();
		~FEKOSimulationSARClass();

	public:  
		std::vector<FEKOBase::FEKOSatelliteParams> FEKOAntPoselist;// FEKO的天线参数设置
		void setFEKOAntPoselist(std::vector<FEKOBase::FEKOSatelliteParams> FEKOAntPoselist); // FEKO的天线参数设置
		std::vector<FEKOBase::FEKOSatelliteParams> getFEKOAntPoselist();

	public:
		void generator_STRIP_FEKOSatelliteParams();
		void generator_SCAN_FEKOSatelliteParams();
		void generator_ISAR_FEKOSatelliteParams();
		void generator_CircleSAR_FEKOSatelliteParams();
		void generator_FEKOSatelliteParams();
		
		virtual void refreshFEKOSimulationParams();

	public:
		QString workSpace;  // 工作空间
		QString AntennaRadiationPath; // 远程天线等效辐射方向图文件地址
		QString xmlpath;
	public  : // 初始化模型
		void loadFEKOImageSettingXML(QString xmlpath);
		void saveFEKOImageSettingXML();
		QString createLuaSciptString(size_t startprfidx, size_t endprfidx);
	};

	//==========================================================
	// FEKO成像 
	//==========================================================

	bool FEKOImageProcess(EchoDataClass& echodata, FEKOImageSettingParams& imageSettingParams, QString& outPath, FEKOImageAlgorithm  algmethod = FEKOImageAlgorithm::TBP_FREQ, ImageAlgWindowFun winfun = ImageAlgWindowFun::HANMMING);

	class FEKOImageProcessAbstractClass {

	public:
		FEKOImageProcessAbstractClass();
		~FEKOImageProcessAbstractClass();
	private:
		EchoDataClass echodata; // 原始回波数据 -
		FEKOImageSettingParams imageSettingParams; // 成像参数
		FEKOImageAlgorithm algmethod; // 成像算法
		QString tiffPath;
	public:
		// 构建与成员变量有关的属性函数
		void setEchoData(EchoDataClass echodata);
		EchoDataClass getEchoData()  const;
		void setImageSettingParams(FEKOImageSettingParams imageSettingParams);
		FEKOImageSettingParams getImageSettingParams();
		void setAlgmethod(FEKOImageAlgorithm algmethod);
		FEKOImageAlgorithm getAlgmethod();
		void settiffPath(QString outtiffPath);
		QString gettiffPath();
		void LoadEchoDataPath(QString echoPath);
	public: // 成像参数
		bool Imageprocess();
	};
};


#endif