#ifndef __SIMPLE_GESTALT_PERCEPTION_H
#define __SIMPLE_GESTALT_PERCEPTION_H

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

class BuildMap : public VisualRoutinesStateNode {
public:
    BuildMap() : VisualRoutinesStateNode("BuildMap") {}
  
    virtual void DoStart() {
        camSkS.clear();
        camShS.clear();
        
        cout << "Begin building board\n";
        //**************** 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.pursueShapes = false;

        req.objectColors[ellipseDataType].insert(blue_index);
        req.objectColors[ellipseDataType].insert(pink_index);
        
        //req.occluderColors[ellipseDataType].insert(blue_index);
        //req.occluderColors[ellipseDataType].insert(pink_index);
        
        req.immediateRequest = true;

        mapBuilder.executeRequest(req);        

        postStateCompletion();
    }
};

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

	virtual void DoStart() {
        cout << "Begin procedure\n";
       
        /*
         * Take all the ellipses and separate pink ones and blue ones 
         */
        NEW_SHAPEVEC(blobs, EllipseData, select_type<EllipseData>(camShS));

        NEW_SKETCH(blue_eggs, bool, visops::zeros(camSkS));
        NEW_SKETCH(pink_eggs, bool, visops::zeros(camSkS));

        IsColor pinkTest("pink");
        IsColor blueTest("blue");

        SHAPEVEC_ITERATE(blobs, EllipseData, b)
            if (pinkTest(b))
                pink_eggs |= b->getRendering();
            if (blueTest(b))
                blue_eggs |= b->getRendering();
        END_ITERATE;

        NEW_SHAPE(blue_border, PolygonData, PolygonData::convexHull(blue_eggs));
        NEW_SKETCH(inside_blue, bool, visops::fillInterior(blue_border->getRendering()));
        NEW_SKETCH(pink_inside, bool, inside_blue & pink_eggs);
        cout << "Done processing the image" << endl;
    }
};

class SimpleGPerception : public VisualRoutinesStateNode {
public:
    SimpleGPerception(): VisualRoutinesStateNode("ParseTicTac") {}
  
	virtual void setup() {
#statemachine
	startnode: BuildMap() =C=> FindOnesInside()
#endstatemachine
    }
};
#endif
