#pragma once
/*****************************************************************//**
 * \file   EchoDataFormat.h
 * \brief  存储仿真过程中的各级产品数据格式，主要包含回波数据格式、仿真参数数据库
 * 
 * \author 30453
 * \date   October 2024
 *********************************************************************/


#include "BaseConstVariable.h"

#include <complex>
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <omp.h>
#include <memory>
#include <vector>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <QString>


#include "BaseTool.h"
#include <iostream>
#include <fstream>
#include <complex>
#include <gdal.h>
#include <gdal_priv.h>
#include <gdalwarper.h>
#include <string>
#include <memory>
#include <QString>
#include <cpl_conv.h> // for CPLMalloc()

//========================================================================
// 成像回波格式
// file type:
// PRFCOUNT
// PRFPOINT
// nearRange
// farRange
// PRF1,time,Px,Py,Pz,Vx,Vy,Vz
// PRF2,time,Px,Py,Pz,Vx,Vy,Vz
// ------------------  脉冲文件部分    --------------------------------------
// PRF1,time,Px,Py,Pz,Vx,Vy,Vz,PRFPOINT,RealData,imagData
// PRF2,time,Px,Py,Pz,Vx,Vy,Vz,PRFPOINT,RealData,imagData
// --------------------------------------------------------------
// 注意Bp并不关心脉冲的顺序，只是关注脉冲的坐标位置，默认按照脉冲的解析顺序进行组织
//========================================================================

// 成像用的回波脉冲文件格式

/// <summary>
/// 回波数据--废弃
/// </summary>
struct PluseData {
	long id;  // PRF id
	double time;// 时间
	double Px; // 坐标
	double Py;
	double Pz;
	double Vx; // 速度
	double Vy;
	double Vz;
	long plusePoints; // 脉冲点数
	std::shared_ptr<std::complex<double>> echoData; // 回波数据
};

long  BASECONSTVARIABLEAPI	getPluseDataSize(PluseData& pluseData);
ErrorCode BASECONSTVARIABLEAPI	 getPluseDataFromBuffer(char* buffer, PluseData& data);
std::shared_ptr<PluseData>  BASECONSTVARIABLEAPI	CreatePluseDataArr(long pluseCount);
std::shared_ptr<std::complex<double>> BASECONSTVARIABLEAPI	 CreateEchoData(long plusePoints);



/// <summary>
/// 姿态数据
/// </summary>
struct PluseAntPos {
	long id;  // PRF id
	double time;// 时间
	double Px; // 坐标
	double Py;
	double Pz;
	double Vx; // 速度
	double Vy;
	double Vz;
};
std::shared_ptr<PluseAntPos>  BASECONSTVARIABLEAPI	CreatePluseAntPosArr(long pluseCount);


// 定义L0级数据
class   BASECONSTVARIABLEAPI	EchoL0Dataset {

public:
	EchoL0Dataset();
	~EchoL0Dataset();


public:
	ErrorCode OpenOrNew(QString folder, QString filename,long PluseCount,long PlusePoints);
	ErrorCode Open(QString xmlfilepath);
	ErrorCode Open(QString folder, QString filename);
	QString getxmlName();
	QString getGPSPointFilename();
	QString getEchoDataFilename();

	void initEchoArr(std::complex<double> init0);


private: // 产品名称设置
	QString folder;
	QString filename;
	QString xmlname;
	QString GPSPointFilename;
	QString echoDataFilename;
	//
	QString xmlFilePath;
	QString GPSPointFilePath;
	QString echoDataFilePath;



public: // 文件处理部分
	// Getter 和 Setter 方法
	long getPluseCount() ;
	void setPluseCount(long pulseCount);

	long getPlusePoints() ;
	void setPlusePoints(long pulsePoints);

	double getNearRange() ;
	void setNearRange(double nearRange);

	double getFarRange() ;
	void setFarRange(double farRange);

	double getCenterFreq() ;
	void setCenterFreq(double freq);

	double getFs() ;
	void setFs(double samplingFreq);

	QString getSimulationTaskName() ;
	void setSimulationTaskName(const QString& taskName);

	double getCenterAngle();
	void setCenterAngle(double angle);

	QString getLookSide();
	void setLookSide(QString lookside);

	double getBandwidth();
	void setBandwidth(double Inbandwidth);

	SatelliteAntPos getSatelliteAntPos(long plusePRFID);

	void setRefPhaseRange(double refRange);
	double getRefPhaseRange();
	// 打印信息的成员函数
	void printInfo() ;	

private: // 回波变量
	long PluseCount;
	long PlusePoints;
	double NearRange;
	double FarRange;
	double centerFreq; // 入射中心频率
	double Fs; // 等效采样频率
	QString simulationTaskName;

	double CenterAngle;
	QString LookSide;
	double refPhaseRange;
	double bandwidth;

public: 	// 读写 XML 的函数
	void saveToXml();
	ErrorCode loadFromXml();

public:
	// 读取文件
	std::shared_ptr<double> getAntPos();
	std::shared_ptr<std::complex<double>> getEchoArr(long startPRF, long PRFLen);
	std::shared_ptr<std::complex<double>> getEchoArr();
	//保存文件
	ErrorCode saveAntPos(std::shared_ptr<double> ptr); // 注意这个方法很危险，请写入前检查数据是否正确
	ErrorCode saveEchoArr(std::shared_ptr<std::complex<double>> echoPtr, long startPRF, long PRFLen);

};




