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

#include <sstream>

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

using namespace DualCoding;

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

	class BuildMap : public MapBuilderNode {
	public:
		BuildMap() : MapBuilderNode("BuildMap", MapBuilderRequest::localMap) {}
		virtual void DoStart() {
			mapreq.addObjectColor(lineDataType,"pink");
			mapreq.addObjectColor(lineDataType,"blue");
			mapreq.addObjectColor(lineDataType,"green");
			mapreq.addObjectColor(ellipseDataType,"pink");
			mapreq.addObjectColor(ellipseDataType,"blue");
			mapreq.addObjectColor(ellipseDataType,"green");
		}
	};

	class ExamineMap : public VisualRoutinesStateNode {
	public:
		ExamineMap() : VisualRoutinesStateNode("ExamineMap") {}
		virtual void DoStart() {
			NEW_SHAPEVEC(lines, LineData, select_type<LineData>(localShS));
			NEW_SHAPEVEC(ellipses, EllipseData, select_type<EllipseData>(localShS));
			int const numLines = lines.size();
			int const numEllipses = ellipses.size();
			ostringstream result;
			if ( numLines + numEllipses == 0 )
				result << "I did not see any valid shapes.";
			else {
				result << "I saw ";
				if ( numLines == 0 )
					result << "no";
				else
					result << numLines;
				result << " line";
				result <<  ( numLines != 1 ? "s" : "");
				result << " and ";
				if ( numEllipses == 0 )
					result << "no";
				else
					result << numEllipses;
				result << " ellipse";
				result <<  ( numEllipses != 1 ? "s" : "");
				result << ".";
			}
			sndman->speak(result.str());
		}
	};

	virtual void setup() {
#statemachine
	startnode: BuildMap() =MAP=> ExamineMap()
#endstatemachine
			}
};

#endif

				
