//-*-c++-*-
#ifndef INCLUDED_BoundingBlobsBehavior_h_
#define INCLUDED_BoundingBlobsBehavior_h_

#include "Behaviors/StateMachine.h"
#include "DualCoding/DualCoding.h"
#include "Sound/SoundManager.h"

using namespace DualCoding;

class BoundingBlobsBehavior : public VisualRoutinesStateNode {
public:
  BoundingBlobsBehavior(): VisualRoutinesStateNode("BoundingBlobsBehavior") {}
  
class BuildBoundingBlobs : public VisualRoutinesStateNode {
public:
  BuildBoundingBlobs() : VisualRoutinesStateNode("BuildCamMap") {}
  
  virtual void DoStart() {
    
    //**************** Set up map builder request ****************
    const int pink_index = ProjectInterface::getColorIndex("pink");
    const int blue_index = ProjectInterface::getColorIndex("blue");

    MapBuilderRequest req(MapBuilderRequest::cameraMap);
	req.maxDist = 1500;
	req.numSamples = 1;
	req.clearShapes = true;

    req.objectColors[ellipseDataType].insert(pink_index);
    req.objectColors[ellipseDataType].insert(blue_index);

	req.immediateRequest = true;
	unsigned int mapreq_id = mapBuilder.executeRequest(req);
	postStateCompletion();

  }

};


	class ExamineBlobs: public VisualRoutinesStateNode {
	public:
		ExamineBlobs() : VisualRoutinesStateNode("ExamineBlobs") {}

		virtual void DoStart() {
    	sndman->playFile("barklow.wav");
    	cout << "MapBuilder found " << camShS.allShapes().size() << " shapes." << endl;

		NEW_SHAPEVEC(allEllipses, EllipseData, select_type<EllipseData>(camShS));

		// extract blue ellipses shapevec
		NEW_SHAPEVEC(blueEllipses, EllipseData, subset(allEllipses, IsColor("blue")));

		// extrack pink ellipses shapevec
		NEW_SHAPEVEC(pinkEllipses, EllipseData, subset(allEllipses, IsColor("pink")));
		
		// generate sketch<bool> of blue ellipses
		NEW_SKETCH(blue_ellipses_sketch, bool, visops::zeros(camSkS));
		SHAPEVEC_ITERATE(blueEllipses, EllipseData, be)
			blue_ellipses_sketch |= (Sketch<bool>)(be->getRendering());
		END_ITERATE;

		// ask for convex hull of blue blobs, render shape into sketch
		NEW_SHAPE(blueHull, PolygonData, PolygonData::convexHull(blue_ellipses_sketch));
		// foreach pink ellipse, if centroid inside convex hull, add 
		//   rendering to result sketch
		NEW_SKETCH(result, bool, visops::zeros(camSkS));
		SHAPEVEC_ITERATE(pinkEllipses, EllipseData, pe)
			if (blueHull->isInside(pe->getCentroid())) {
				result |= (Sketch<bool>)(pe->getRendering());
			}
		END_ITERATE;
		

	}

	};
		virtual void setup() {
#statemachine
			startnode: BuildBoundingBlobs() =C=> ExamineBlobs()
#endstatemachine
		}
};

#endif
