//---------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#define USE_DLL
#include "Swedll.h"
#include "AstroOL_NativeCalculator.h"

#pragma hdrstop

/*
 * Class:     AstroOL_NativeCalculator
 * Method:    getPlanetsAndHouses
 * Signature: (DDD[D[D)Z
 */
JNIEXPORT jboolean JNICALL Java_AstroOL_NativeCalculator_getPlanetsAndHouses
  (JNIEnv *env, jobject o,
  jdouble jd_ut, jdouble lon, jdouble lat,
  jdoubleArray pl, jdoubleArray h) {

  int i;
  double l_jd_ut = jd_ut,
         l_lat = lat,
         l_lon = lon,
         x[6],
         l_ascmc[10],
         *l_pl, *l_h;
  char _msg[255];

  _msg[0] = '\0';

  /** Das Rückgabeflag verwenden wir in dieser Implementierung nicht */
  jboolean ret = true;

/* Planetenberechnung mit swe_calc */
  l_pl = env->GetDoubleArrayElements(pl,NULL);
  for (i = 0; i < 10; i++) {
    swe_calc( l_jd_ut + swe_deltat( l_jd_ut ), i, 0, x, _msg );
    l_pl[i] = x[0];
    }
  env->ReleaseDoubleArrayElements(pl,l_pl,0);

/* Hausberechnung mit swe_houses */
  l_h = env->GetDoubleArrayElements(h,NULL);
  swe_houses(l_jd_ut, l_lat, l_lon, 'P',
             l_h, l_ascmc);
  env->ReleaseDoubleArrayElements(h,l_h,0);

/* Etwaige Meldungen zurückgeben */
  if (_msg[0] != '\0') {
     jclass oClass = env->GetObjectClass(o);
     jfieldID msgID = env->GetFieldID(oClass,"_msg","Ljava/lang/String;");
     jstring jmsg = env->NewStringUTF(_msg);
     env->SetObjectField(o,msgID,jmsg);
     }

  return ret;

  }

/*
 * Class:     AstroOL_NativeCalculator
 * Method:    getPlanet
 * Signature: (DILjava/lang/StringBuffer;)[D
 */
JNIEXPORT jdoubleArray JNICALL Java_AstroOL_NativeCalculator_getPlanet
  (JNIEnv* env, jobject o, jdouble jd_ut, jint planet, jint iflag) {
     int l_pl = planet;
     int l_iflag = iflag;
     double l_jd_ut = jd_ut;
     double x[6];
     int i = 0;
     char _msg[255];
     _msg[0] = '\0';

     /* Einzelnen Planeten berechnen - Einfachstaufruf von swe_calc( ) */
     i = swe_calc( l_jd_ut + swe_deltat( l_jd_ut ), l_pl, l_iflag, x, _msg);

     /* Errechneten Array zurückgeben */
     jdoubleArray jx = env->NewDoubleArray(6);
     double *_jx = env->GetDoubleArrayElements(jx,NULL);
     for (i=0;i<6;i++) _jx[i] = x[i];
     env->ReleaseDoubleArrayElements(jx,_jx,0);

     /* Etwaige Meldungen zurückgeben */
     if (_msg[0] != '\0') {
       jclass oClass = env->GetObjectClass(o);
       jfieldID msgID = env->GetFieldID(oClass,"_msg","Ljava/lang/String;");
       jstring jmsg = env->NewStringUTF(_msg);
       env->SetObjectField(o,msgID,jmsg);
       }

     return jx;

  }

/*
 * Class:     AstroOL_NativeCalculator
 * Method:    getHouse
 * Signature: (DDDDLjava/lang/StringBuffer;)D
 */
JNIEXPORT jdouble JNICALL Java_AstroOL_NativeCalculator_getHouse
  (JNIEnv *env, jobject o, jdouble jd_ut, jdouble lon, jdouble lat,
   jdouble houseNumber, jobject serr){


  double l_jd_ut = jd_ut,
         l_lat = lat,
         l_lon = lon,
         l_ascmc[10],
         *l_h;

  /* Placidus-Häuser berechnen, einfachster Aufruf von swe_houses( ) */
  swe_houses(l_jd_ut, l_lat, l_lon, 'P',
                     l_h, l_ascmc);

  /* Zwischenwerte (z.B. Länge der Mitte von Haus II) werden nicht berechnet */
  int i = houseNumber;
  jdouble l = l_h[i];
  return l;

 }





