#include <iostream>
using namespace std;


#include <commandline.h>
#include <gobj.h>
#include <graphmisc.h>
#include <maze003.h>
#include <mazedisp02.h>
#include <mazematrixD2.h>
#include <mazematrixD2createmaze.h>
#include <zpr.h>

string maze003::doc[] = 
{
  "",
  "$ ./main prog=12 m=10 n=20 dx=0.15 backgroundcolor=0,255,0 wallcolor=0,25,255 randozize=0 id=1 origin=-1.4,-.5,0 - Display m by n maze."
};

void maze003::keyboard01
(
  unsigned char key, 
  int x, 
  int y
)
{
  switch (key)
  {
    case 27:
      exit(0);
      break;
  }
}

void maze003::display01()
{ 
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  gobj::global->draw();

  glerrordisplay();
  
  glutSwapBuffers();
}


maze003::maze003(int argc, char** argv)
  : xGraphics(true)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(maze003::display01);
  glutKeyboardFunc(maze003::keyboard01);

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  xGraphics.set();


  commandline cmd(argc,argv);

  // Construct the maze.

  uint m=8;
  uint n=12;
  cmd.mapvar(m,"m");
  cmd.mapvar(n,"n");

  bool randomize=true;
  cmd.mapvar(randomize,"randomize");
  if (randomize)
    srand( (unsigned)time( NULL ) );

  mazematrixD2<uint> mz(m,n);
  mazematrixD2createmaze<uint> mc(mz);
  mc.buildpropermaze(); 

  bool proper=true;
  cmd.mapvar(proper,"proper");
  double deletewall=0.025; // 2.5%
  cmd.mapvar(deletewall,"deletewall");
  if (proper==false)
    mc.impropermaze01(deletewall);

  assert(mz.valid());


  double dx=0.1;
  cmd.mapvar(dx,"dx");

  mazedisp02 md(dx,mz);

  cmd.mapvar(md.pipes,"pipes");
  graphmisc::colornormalize(md.pipecolor,cmd,"pipecolor");

  cmd.mapvar(md.displaycellid,"id");

  point2<double> origin(0.0,0.0);
  string originstr("(0,0)");
  cmd.mapvar(originstr,"origin");
  origin.serializeInverseBrackets(originstr);

  point3<double> background;
  graphmisc::colornormalize(background,cmd,"backgroundcolor");

  cmd.mapvar(md.walls,"walls");
  graphmisc::colornormalize(md.wallcolor,cmd,"wallcolor");

  gobjpush(new gobjglClearColor(background));
  gobjpush(new gobjglClear(GL_COLOR_BUFFER_BIT));

  gobjpush(new gobjglPushMatrix());
  gobjpush(new gobjglTranslated(origin.x,origin.y,0.0));
  md.draw();
  gobjpush(new gobjglPopMatrix());
}


void maze003::eval()
{
  zpr zz;

  zz.update();
  glutMainLoop();
}


