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

$nodeclass Lab3part2part4 : VisualRoutinesStateNode {
	$nodeclass BuildMap : MapBuilderNode : doStart {
		mapreq.addObjectColor(ellipseDataType, "green");
		mapreq.addObjectColor(ellipseDataType, "blue");
		mapreq.addObjectColor(lineDataType, "red");
	}

	$setupmachine {
		BuildMap =MAP=> CountMap
	}

	$nodeclass CountMap : VisualRoutinesStateNode : doStart {
		cout << "There were " << camShS.allShapes().size() << " ellipses." << endl;
		NEW_SHAPEVEC(lines, LineData, select_type<LineData>(camShS));

		bool found = false;
		Shape<LineData> line;
		SHAPEVEC_ITERATE(lines, LineData, myline)
			if (myline->getLength() > 200 && !found) {
				found = true;
				myline->setInfinite();
				line = myline;
			} else
				myline.deleteShape();
		END_ITERATE;

		if (!found) {
			cout << "There is no line." << endl;
			return;
		}

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

		int left = 0;
		int right = 0;
		SHAPEVEC_ITERATE(blobs, EllipseData, myblob)
			if (myblob->getSemimajor() > 20) {
				if (line->pointIsLeftOf(myblob->getCentroid()))
					left++;
				else
					right++;
			} else
				myblob.deleteShape();
		END_ITERATE;
		
		if (left > 0 || right > 0) 
			cout << "There are " << left << " ellipses to the left of the line and " << right << " ellipses to the right." << endl;
		else
			cout << "There were no ellipses detected." << endl;
	}
	
}

REGISTER_BEHAVIOR(Lab3part2part4);
