#ifndef m_time
#define m_time
#include <ctime>
#include "SystemCoords.h"


struct orbit_date
	{
		int years; //���
		int mounts; //�����
		int days; //����
		int hours; //���
		int min; //������
		int sec; //�������
	};
class Ot {
private:
	const double m_correction = 69.184; // �������� ����������� �������� ��������� ����� TAI ������������ UTC � �������� ��������� ����� TT ������������� TAI 
	timespec c_time{ 0,0 };
	ConvertSC m_matrix{};

public:
	Ot() {
		timespec_get(&c_time, TIME_UTC);
	};
	~Ot() {};
	//������� ����� � UNIX ���������, ������� �������� - ������� ����
	double getCurrent_US(double time_zone = 0) {
		timespec_get(&c_time, TIME_UTC);
		return (double(c_time.tv_sec)+ time_zone *3600 + c_time.tv_nsec * pow(10, -9));
	};
	//������� ����� � ���������������� ��������� ����, ������� �������� - ������� ����
	double getCurrent_MJD(double time_zone = 0) {
		return convert_JD_to_MJD(convert_US_to_JD(getCurrent_US(time_zone)));
	};
	//������� ����� � ������ �����, ������� �������� - ������� ����
	double getCurrent_TT(double time_zone = 0) {
		return (getCurrent_MJD(time_zone) + m_correction / double(86400));
	}
	//������� ������������ ���������������� �����, ������� �������� - ������� ����
	double getCurrent_TDB(double time_zone = 0);
	//������� ������������ �������� ����� 
	double GMST(double deltuUT = 0);
	//������ �������� ������������ �������� ����� 
	double GTST(double inputGMST);
	
	//input_time must be in the format US
	double convert_US_to_JD(double input_time, double time_zone = 0) {
		return (2440587.5 + (input_time + time_zone *3600) / double(86400));
	};
	//input_time must be in the format JD
	double convert_JD_to_MJD(double input_time) {
		return (input_time - 2400000.5);
	};
	//input_time must be in the format MJD
	double convert_MJD_to_TT(double input_time) {
		return (input_time + m_correction / double(86400));
	}
	//input_time must be in the format TT
	double convert_TT_to_TDB(double input_time);

	double convert_GDs_to_MJD(orbit_date input_time);
	double convert_MJD_to_TDB(double input_time);
	double convert_MJD_to_GMST(double input_MJD, double deltaUT = 0);
	double convert_GMST_to_GTST(double input_MJD, double input_GMST);
	double convert_MJD_to_GTST(double input_MJD, double deltaUT = 0);

};

#endif // !orbit_time.h