//=============================================================================
#include "movieIO.h"
#include "rgbImage.h"
#include "featureCorrelator.h"
#include "subWindow.h"
#include "percentBar.h"

int main( int argc, char *argv[] )
{
  movieIO movie;
  if ( argc<4 )
  {
    printf( "Usage: %s <moviefile> <minPerFrame> <minTrackLength> [outfile]\n",
	    argv[0] );
    exit(0);
  }

  FILE *output;
  if ( argc>4 )
  {
    output = fopen( argv[4], "w" );
    if ( output==0 )
    {
      printf("Couldn't open output: %s\n", argv[4] );
      exit(0);
    }
  }
  else
  {
    output = stdout;
  }

  int minPerFrame = atoi(argv[2]);
  if ( minPerFrame<=0 )
  {
      printf("Error in specification of minimum number of features \n" );
      printf("to track per frame: %i\n", minPerFrame );
      exit(0);
  }
  
  int minTrackLen = atoi(argv[3]);
  if ( minTrackLen<=0 )
  {
      printf("Error in specification of minimum length of feature \n" );
      printf("tracking: %i\n", minTrackLen );
      exit(0);
  }

  
  fprintf( stderr, "Preparing \"%s\"...\n", argv[1] );
  if ( !movie.open( argv[1] ) )
  {
    printf( "Error in preparing %s\n", argv[1] );
    exit(0);
  }

  
  vector<subWindowListAnim> features;
  if ( output==stdout )
  {
    fprintf( stderr, "Initializing Correlator...\n" );
    featureCorrelator corl( 0, movie, true );
    fprintf( stderr, "Tracking Features...\n" );
    features =
      corl.buildTrackedFeatureList( 0, minPerFrame, minTrackLen,
				    (movie.getWidth()>movie.getHeight() ?
				     movie.getWidth():movie.getHeight())*0.1f);
  }
  else
  {
    printf("\n");
    featureCorrelator corl( "Initializing Correlator: ", movie, true );
    printf("\n");
    features =
      corl.buildTrackedFeatureList( "Tracking Features: ",
				    minPerFrame, minTrackLen,
				    (movie.getWidth()>movie.getHeight() ?
				     movie.getWidth():movie.getHeight())*0.1f);
    printf("\n");
  }

  if ( output==stdout )
  {
    fprintf( stderr, "\nThe following output is meant to be captured to\n" );
    fprintf( stderr, "a text file for later analysis\n\n" );
  }
  
  fprintf( output, "// Tracking data generated from \"%s\"\n", argv[1] );
  fprintf( output, "// minPerFrame = %i\n", minPerFrame );
  fprintf( output, "// minTrackLen = %i\n", minTrackLen );
  fprintf( output, "#ifndef FEATURE_LIST_NAME\n");
  fprintf( output, "  #include \"subWindow.h\"\n" );
  fprintf( output, "  vector<subWindowListAnim> test;\n" );
  fprintf( output, "  #define FEATURE_LIST_NAME test\n");
  fprintf( output, "#endif\n");
  fprintf( output, "#define FEAT_LIST_ADD(featnum, framenum, centX, centY, sizeX, sizeY ) \\\n" );
  fprintf( output, "  if (featnum>=FEATURE_LIST_NAME.size()) FEATURE_LIST_NAME.resize(featnum+1); \\\n" );
  fprintf( output, "  FEATURE_LIST_NAME[featnum].addSubWindow(framenum, subWindow(centX, centY, sizeX, sizeY));\n" );
  fprintf( output, "#ifdef WIDTH_VAR\n" );
  fprintf( output, "  WIDTH_VAR = %i;\n", movie.getWidth() );
  fprintf( output, "#endif\n");
  fprintf( output, "#ifdef HEIGHT_VAR\n" );
  fprintf( output, "  HEIGHT_VAR = %i;\n", movie.getHeight() );
  fprintf( output, "#endif\n");
  fprintf( output, "#ifdef LENGTH_VAR\n" );
  fprintf( output, "  LENGTH_VAR = %i;\n", movie.getLength() );
  fprintf( output, "#endif\n");

  int featNum=0;
  for ( vector<subWindowListAnim>::iterator iter=features.begin();
	iter!=features.end(); iter++, featNum++ )
  {
    for ( int frameNum=iter->getInterval().getStart();
	  frameNum<=iter->getInterval().getEnd(); frameNum++ )
    {
      const subWindow *curr = &(iter->getSubWindow(frameNum));
      fprintf( output,  "FEAT_LIST_ADD( %i, %i, %i, %i, %i, %i )\n", featNum, frameNum,
	       curr->centerX(), curr->centerY(), curr->sizeX(), curr->sizeY() );
    }
  }

  fprintf( output, "\n");
  
  if ( output!=stdout )
    fclose(output);
  else
  {
    movie.play();
  }
  movie.close();
}
