#ifndef STATE_H
#define STATE_H

#include "selection_info.h"
#include "zoom_info.h"
#include "pan_info.h"

/*
 * Buffer object identifiers.
 */
#define BASE_VERTICES 0
#define BASE_COLORS 1

#define CLEAR_COLOR 1.0, 1.0, 1.0, 1.0
#define DRAW_COLOR 0.0, 0.0, 0.0

#define DEFAULT_COLOR_R 0.00
#define DEFAULT_COLOR_G 0.00
#define DEFAULT_COLOR_B 0.01
#define DEFAULT_COLOR_A (1.0 / 7.0)

#define SELECT_COLOR_R 0.00
#define SELECT_COLOR_G 0.00
#define SELECT_COLOR_B 0.00
#define SELECT_COLOR_A 0.75

typedef enum
{ PROTEIN_GEOMETRY, PROTEIN_SELECTED_GEOMETRY, DENSITY_LEGEND_GEOMETRY,
  MAP_GEOMETRY, DATAROSE_GEOMETRY
} LISTS;
#define NUM_LISTS 5

/*
 * Maintain state of the model.
 */
typedef struct
{
  /*
   * Number of nodes having coordinates assigned.
   */
  unsigned int rows;

  /* 
   * Display lists.
   */
  unsigned int list_offset;

  /* 
   * Track the bounding box of the points.
   */
  struct
  {
    float min_x;
    float max_x;
    float min_y;
    float max_y;
  } bb;

  /*
   * Minimum coordinate for the orthographic projection. 
   */
  float ortho_min;

  /*
   * Maximum coordinate for the orthographic projection.
   */
  float ortho_max;

  /*
   * Orthographic coordinates after aspect preserving scaling.
   */
  struct
  {
    double min_x;
    double max_x;
    double min_y;
    double max_y;
  } ortho;

  /*
   * Buffer objects.
   */
  unsigned int buffers[1];

  /*
   * GI Identifiers indexed by row. Storage is [rows][20].
   */
  char *gi_data;

  /*
   * 2D coordinates for each protein. Storage is [rows][2].
   */
  float *base_vertices_data;

  /*
   * RGB color for each protein. Storage is [rows][4].
   */
  float *base_colors_data;

  SELECTION_INFO selection;

  ZOOM_INFO zoom;

  PAN_INFO pan;

  /*
   * Display a legend on the map.
   */
  bool legend;

} STATE;

#endif // STATE_H