#include "NavUtils.h"

// Defined constants for use with gctpc 
#define Geographic 0
#define UTM 1
#define WGS84Spheroid 12
#define Radians  0           // Radians
#define Meters   2           // Meters
#define SilentMode -1
#define NameLen   256
#define Ignored -1

extern "C" {
void gctp(double *incoor, long *insys, long *inzone, double *inparm,
	 long *inunit, long *indatum, long *ipr, char *efile, 
	 long *jpr, char *pfile, double *outcoor, long *outsys,
	 long *outzone, double *outparm, long *outunit,
	 long *outdatum, char *fn27, char *fn83, long *iflg); 
};


int NavUtils::geoToUtm(double latitude, double longitude, long utmZone,
		       double *northing, double *easting)
{
  long insys     = Geographic;
  long inzone    = Ignored;
  long inunit    = Radians;  
  long indatum   = WGS84Spheroid;
  long ipr       = SilentMode;
  long jpr       = SilentMode;

  long outsys    = UTM;   
  long outunit   = Meters;
  long outdatum  = WGS84Spheroid;

  long outzone   = utmZone;

  double inparm[15];

  double inputCoord[2];
  inputCoord[0] = longitude;  
  inputCoord[1] = latitude;  

  double outparm[15];
  double outputCoord[2];

  char errorFile[32];
  char projMsgFile[32];
  char nad27File[32];
  char nad83File[32];
  long errorFlag;

  gctp(inputCoord, &insys, &inzone, inparm, &inunit, &indatum, &ipr,
       errorFile, &jpr, projMsgFile, outputCoord, &outsys, &outzone, outparm, 
       &outunit, &outdatum, nad27File, nad83File, &errorFlag);

  *easting = outputCoord[0]; 
  *northing = outputCoord[1];

  return 0;
}


int NavUtils::utmToGeo(double northing, double easting, long utmZone,
		       double *latitude, double *longitude)
{
  long insys     = UTM;

  long inzone    = utmZone;

  long inunit    = Meters;
  long indatum   = WGS84Spheroid;
  long ipr       = SilentMode;
  long jpr       = SilentMode;

  long outsys    = Geographic;
  long outunit   = Radians;
  long outdatum  = WGS84Spheroid;

  long outzone   = Ignored;

  double inparm[15];

  double inputCoord[2];
  inputCoord[0] = easting;
  inputCoord[1] = northing;

  double outparm[15];
  double outputCoord[2];

  char errorFile[32];
  char projMsgFile[32];
  char nad27File[32];
  char nad83File[32];
  long errorFlag;

  gctp(inputCoord, &insys, &inzone, inparm, &inunit, &indatum, &ipr,
       errorFile, &jpr, projMsgFile, outputCoord, &outsys, &outzone, outparm, 
       &outunit, &outdatum, nad27File, nad83File, &errorFlag);

  *longitude = outputCoord[0]; 
  *latitude = outputCoord[1];

  return 0;
}
