/***************************************************************************
                          ksmoon.h  -  Trinity Desktop Planetarium
                             -------------------
    begin                : Sun Aug 26 2001
    copyright            : (C) 2001 by Jason Harris
    email                : kstars@30doradus.org
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef KSMOON_H
#define KSMOON_H

#include "ksplanetbase.h"
#include "dms.h"

/**@class KSMoon
	*A subclass of SkyObject that provides information
	*needed for the Moon.  Specifically, KSMoon provides a moon-specific
	*findPosition() function.  Also, there is a method findPhase(), which returns
	*the lunar phase as a floating-point number between 0.0 and 1.0.
	*@short Provides necessary information about the Moon.
	*@author Jason Harris
	*@version 1.0
	*/

class KStarsData;
class KSSun;

class KSMoon : public KSPlanetBase  {
public:
	/**
		*Default constructor.  Set name="Moon".
		*/
	KSMoon(KStarsData *kd);

	/**Destructor (empty). */
	~KSMoon();

	/**
		*Determine the phase angle of the moon, and assign the appropriate
		*moon image
		*@param Sun The current Sun object.
		*/
	void findPhase( const KSSun *Sun );

	/**@return the moon's current phase angle, as a dms angle
		*/
	dms phase( void ) const { return Phase; }

	/**@return the illuminated fraction of the Moon as seen from Earth
		*/
	double illum( void ) const { return 0.5*(1.0 - cos( phase().radians() ) ); }
	
	/**@return a short string describing the moon's phase
		*/
	TQString phaseName( void ) const;

	/** reimplemented from KSPlanetBase
		*/
	virtual bool loadData();

protected:
	/**Reimplemented from KSPlanetBase, this function employs unique algorithms for
		*estimating the lunar coordinates.  Finding the position of the moon is
		*much more difficult than the other planets.  For one thing, the Moon is
		*a lot closer, so we can detect smaller deviations in its orbit.  Also,
		*the Earth has a significant effect on the Moon's orbit, and their
		*interaction is complex and nonlinear.  As a result, the positions as
		*calculated by findPosition() are only accurate to about 10 arcseconds
		*(10 times less precise than the planets' positions!)
		*@short moon-specific coordinate finder
		*@param num KSNumbers pointer for the target date/time
		*@note we don't use the Earth pointer here
		*/
	virtual bool findGeocentricPosition( const KSNumbers *num, const KSPlanetBase* );

private:
	dms Phase;
	static bool data_loaded;

/**@class MoonLRData
	*Encapsulates the Longitude and radius terms of the sums
	*used to compute the moon's position.
	*@short Moon Longitude and radius data object
	*@author Mark Hollomon
	*@version 1.0
	*/
	class MoonLRData {
		public:
			int nd;
			int nm;
			int nm1;
			int nf;
			double Li;
			double Ri;

			MoonLRData( int pnd, int pnm, int pnm1, int pnf, double pLi, double pRi ):
				nd(pnd), nm(pnm), nm1(pnm1), nf(pnf), Li(pLi), Ri(pRi) {}
	};

	static TQPtrList<MoonLRData> LRData;

/**@class MoonBData
	*Encapsulates the Latitude terms of the sums
	*used to compute the moon's position.
	*@short Moon Latitude data object
	*@author Mark Hollomon
	*@version 1.0
	*/
	class MoonBData {
		public:
			int nd;
			int nm;
			int nm1;
			int nf;
			double Bi;

			MoonBData( int pnd, int pnm, int pnm1, int pnf, double pBi ):
				nd(pnd), nm(pnm), nm1(pnm1), nf(pnf), Bi(pBi) {}
	};

	static TQPtrList<MoonBData> BData;
};

#endif
