#ifndef __ARG_PARSER_H__
#define __ARG_PARSER_H__

#include "string.h"
#include "stdio.h"
#include "assert.h"
#include "stdlib.h"

class ArgParser {

public:

  ArgParser() { DefaultValues(); }

  ArgParser(int argc, char *argv[]) {
    DefaultValues();

    for (int i = 1; i < argc; i++) {
      if (!strcmp(argv[i],"-input")) {
        i++; assert (i < argc); 
        input_file = fopen(argv[i],"r");
        assert(input_file != NULL);
      } else if (!strcmp(argv[i],"-size")) {
	i++; assert (i < argc); 
	width = height = atoi(argv[i]);
      } else if (!strcmp(argv[i],"-grid")) {
	i++; assert (i < argc); 
	nx = atoi(argv[i]);
	assert (nx > 0);
	i++; assert (i < argc); 
	ny = atoi(argv[i]);
	assert (ny > 0);
	i++; assert (i < argc); 
	nz = atoi(argv[i]);
	assert (nz > 0);
      } else if (!strcmp(argv[i],"-viscosity")) {
	i++; assert (i < argc); 
	viscosity = atof(argv[i]);
	assert (viscosity >= 0);
      } else if (!strcmp(argv[i],"-timestep")) {
	i++; assert (i < argc); 
	timestep = atof(argv[i]);
        assert (timestep > 0);
      } else if (!strcmp(argv[i],"-gravity")) {
	i++; assert (i < argc); 
	gravity = atof(argv[i]);

      } else if (!strcmp(argv[i],"-markers")) {
        markers = true;
      } else if (!strcmp(argv[i],"-edge_velocity")) {
        edge_velocity = true;
      } else if (!strcmp(argv[i],"-velocity")) {
        velocity = true;
      } else if (!strcmp(argv[i],"-surface")) {
        surface = true;
      } else if (!strcmp(argv[i],"-wireframe")) {
        wireframe = true;
      } else if (!strcmp(argv[i],"-cubes")) {
        cubes = true;
      } else if (!strcmp(argv[i],"-pressure")) {
        pressure = true;

      } else if (!strcmp(argv[i],"-isosurface")) {
	i++; assert (i < argc); 
	isosurface = atof(argv[i]);
	assert (isosurface > 0 && isosurface < 1);
      } else if (!strcmp(argv[i],"-density")) {
	i++; assert (i < argc); 
	density = atoi(argv[i]);

      } else {
	printf ("whoops error with command line argument %d: '%s'\n",i,argv[i]);
	assert(0);
      }
    }
  }

  void DefaultValues() {
    input_file = NULL;
    width = 100;
    height = 100;
    nx = ny = nz = 5;
    viscosity = 0.1; 
    timestep = 0.01;
    gravity = 1;
    animate = false;

    markers = true;
    edge_velocity = false;
    velocity = true;
    surface = false;
    wireframe = false;
    cubes = false;
    pressure = false;

    isosurface = 0.5;
    density = 10;
  }

  // ==============
  // REPRESENTATION
  // all public! (no accessors)

  FILE *input_file;
  int width;
  int height;
  int nx,ny,nz;
  float viscosity;
  float timestep;
  float gravity;
  bool animate;

  bool markers;
  bool edge_velocity;
  bool velocity;
  bool surface;
  bool wireframe;  
  bool cubes;
  bool pressure;

  float isosurface;
  int density;
};

#endif

