#include "DualCoding/DualCoding.h"

#include "Behaviors/StateMachine.h"

#include "Events/EventRouter.h"

using namespace DualCoding;

class VisualLine : public VisualRoutinesStateNode { 
public:
	VisualLine() : VisualRoutinesStateNode("VisualLine") {}
	enum distanceResult { blue, pink, same };
	class VisualLineNode : public VisualRoutinesStateNode {
	public:
		VisualLineNode() : VisualRoutinesStateNode("VisualLineNode") {}
		virtual void DoStart(){
		NEW_SKETCH(camFrame, uchar, sketchFromSeg());
		NEW_SKETCH(green_stuff, bool, visops::colormask(camFrame,"green"));
		NEW_SKETCH(blue_stuff, bool, visops::colormask(camFrame,"yellow"));
		NEW_SHAPE(boundary_line, LineData, LineData::extractLine(orange_stuff));
		NEW_SKETCH(topside, bool, visops::topHalfPlane(boundary_line));
		NEW_SKETCH(side1, bool, yellow_stuff & topside);
		NEW_SKETCH(side2, bool, yellow_stuff & !topside);
		NEW_SHAPEVEC(side1blobs, BlobData, BlobData::extractBlobs(side1,50));
		NEW_SHAPEVEC(side2blobs, BlobData, BlobData::extractBlobs(side2,50));
		vector<Shape<BlobData> > &winners = side1blobs.size() > side2blobs.size() ? side1blobs : side2blobs;
		NEW_SKETCH(result, bool, visops::zeros(yellow_stuff));
		SHAPEVEC_ITERATE(winners, BlobData, b)
		result |= b->getRendering();
		END_ITERATE;
		boundary_line->setInfinite();







			NEW_SKETCH(camFrame, uchar, sketchFromSeg());

   			// find the largest blue blob in the image
    			NEW_SKETCH(blue_stuff, bool, visops::colormask(camFrame,"blue"));
    			NEW_SKETCH(b_cc, uint, visops::labelcc(blue_stuff));
    			NEW_SKETCH(b_area, uint, visops::areacc(b_cc));
    			NEW_SKETCH(b_max, bool, b_area == b_area->max());
    			int const numBlueRegion = b_area->max();

    			//find the largest pink blob in the image
    			NEW_SKETCH(pink_stuff, bool, visops::colormask(camFrame,"pink"));
    			NEW_SKETCH(p_cc, uint, visops::labelcc(pink_stuff));
    			NEW_SKETCH(p_area, uint, visops::areacc(p_cc));
    			NEW_SKETCH(p_max, bool, p_area == p_area->max());
    			int const numPinkRegion = p_area->max();

    			//based on which one is closer make different sounds
    			NEW_SKETCH(result, bool, numBlueRegion > numPinkRegion ? b_max : p_max);

    			int eps;

    			//calculate epsilon for range of values for which the two nodes are different
    			if(numBlueRegion >= numPinkRegion){
     				eps = numPinkRegion/numBlueRegion;
    			}else {
      			eps = numBlueRegion/numPinkRegion;
      			}

    			//first we check if the regions are roughly equal
    			if((eps < 1.1)|| (eps > 0.9))
      				postStateSignal<unsigned int>(same);
    			else if ( numBlueRegion > numPinkRegion)  // blue region greater
      				postStateSignal<unsigned int>(blue);
    			else // pink region greater
      				postStateSignal<unsigned int>(pink); 
  		}
	};

virtual void setup() {

#statemachine

startLine:  VisualLineNode()

same_node: SoundNode($, "barkmed.wav")

blue_node: SoundNode($, "howl.wav")

pink_node: SoundNode($, "toc.wav")

startJudge =S<unsigned int>(same)=>same_node

same_node =C=> startJudge

startJudge =S<unsigned int>(pink)=>pink_node 

pink_node =C=> startJudge

startJudge =S<unsigned int>(blue)=>blue_node 

blue_node =C=> startJudge
    
#endstatemachine

startnode = startJudge;
}

};
