/*
 * A hastily written program to convert SQM observations exported
 * in CSV format to placemarks in a Google Earth KML file.
 * This program is currently entirely inflexible, and doesn't do much
 * error checking.  If it encounters a CSV line with more or less records
 * than what is expected, it skips it and moves on.
 *
 * John Stone
 * <johns@megapixel.com>
 * $Id: csvtokml.c,v 1.2 2006/06/08 21:37:52 johns Exp $
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int kmlwriteheader(FILE *fp) {
  fprintf(fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
  fprintf(fp, "<kml xmlns=\"http://earth.google.com/kml/2.0\">\n");
  fprintf(fp, "<Folder>\n");
  
  return 0;
}

int kmlwritefooter(FILE *fp) {
  fprintf(fp, "</Folder>\n");
  fprintf(fp, "</kml>\n");

  return 0;
}

int kmlwriteplace(FILE *fp, char *desc, char *name, char *lon, char *lat, char *elev) {
  fprintf(fp, "<Placemark>\n");
  fprintf(fp, "<description>%s</description>\n", desc);
  fprintf(fp, "<name>%s</name>\n", name); 
  fprintf(fp, "<Point>\n");
  fprintf(fp, "<extrude>1</extrude>\n");
  fprintf(fp, "<altitudeMode>relativeToGround</altitudeMode>\n");
  fprintf(fp, "<coordinates>%s,%s,%s</coordinates>\n", lat, lon, elev);
  fprintf(fp, "</Point>\n");
  fprintf(fp, "</Placemark>\n");

  return 0;
}
                      

int readcsvline(char *str, char ***argv) {
  int len, i, cnt;
  len=strlen(str);
  *argv=malloc(len*sizeof(char **));

  (*argv)[0]=str;
  cnt=1;
  for (i=0; i<len; i++) {
    if (str[i] == ',') {
      str[i]='\0';
      i++;
      (*argv)[cnt]=str + i;
      cnt++;
    }
  }    

  return cnt;
}


int printsummarytxt(char *dest, int argc, char **argv) {
  int i;
  char tmp[4096];

  sprintf(dest, "<![CDATA[\n");
  strcat(dest, "<a href=\"http://www.unihedron.com/projects/darksky/\">SQM Reading</a>\n");
  sprintf(tmp, "%s mag/arcsec^2\n", argv[1]);  
  strcat(dest, tmp);
  sprintf(tmp, "<br>UT date/time: %s\n", argv[0]);
  strcat(dest, tmp);
  sprintf(tmp, "<br>Conditions: %s\n", argv[3]);
  strcat(dest, tmp);
  sprintf(tmp, "<br>Zenith: %s\n", argv[2]);
  strcat(dest, tmp);
  sprintf(tmp, "<br>Description: %s\n", argv[7]);
  strcat(dest, tmp);
  if (strlen(argv[6]) > 8) {
    char *cscurl = argv[6];
    /* skip any leading whitespace */
    while (*cscurl == ' ' && cscurl != '\0')
      cscurl++;
    sprintf(tmp, "<br><a href=\"%s\">Clear Sky Clock</a>\n", cscurl);
    strcat(dest, tmp);
  } else {
    sprintf(tmp, "<br>No <a href=\"http://cleardarksky.com/csk/\">Clear Sky Clock</a> defined for this site yet.\n", argv[6]);
    strcat(dest, tmp);
  }
  sprintf(tmp, "<br>User: %s\n", argv[8]);
  strcat(dest, tmp);
  strcat(dest, "]]>\n");

  return 0;
}

int convertcsvfile(FILE *ifp, FILE *ofp) {
  char buf[4096], buf2[4096];
  char **argv;
  int cnt, argc;

  cnt=0;
  while (!feof(ifp)) {
    fgets(buf, sizeof(buf), ifp);
    printf("reading line %d, ", cnt);
    argc=readcsvline(buf, &argv);
    printf("read %d args\r", argc);

    if (argc == 9) {
      printsummarytxt(buf2, argc, argv);
      kmlwriteplace(ofp, buf2, argv[1], argv[4], argv[5], "0");
    } else {
      printf("\nskipping line with argc != 9...\n");
    }

    free(argv);
    cnt++;
  }

  return 0;
}

int main(int argc, char **argv) {
  FILE *ifp, *ofp;

  printf("SQM CSV observation log to Google Earth KML converter\n");
  printf("A late night hack by John Stone <johns@megapixel.com>\n");
  printf("-----------------------------------------------------\n");
  if (argc < 3) {
    printf("usage: %s input.csv output.kml\n", argv[0]);
    return -1;
  }

  ifp=fopen(argv[1], "r");
  ofp=fopen(argv[2], "w");

  kmlwriteheader(ofp);

  convertcsvfile(ifp, ofp);

  kmlwritefooter(ofp);

  fclose(ifp);
  fclose(ofp); 

  return 0;
}


