#include "Behaviors/StateMachine.h"

$nodeclass LineEllipses {
    $nodeclass FindLineAndEllipses : MapBuilderNode(MapBuilderRequest::worldMap) : doStart {
        mapreq.addObjectColor(ellipseDataType, "red");
        mapreq.addObjectColor(ellipseDataType, "green");
        mapreq.addObjectColor(ellipseDataType, "blue");
        mapreq.addObjectColor(lineDataType, "red");
    }

    $nodeclass ReportEllipsesOnEachSide : doStart {
        NEW_SHAPEVEC(ellipse_shapes, EllipseData, select_type<EllipseData>(worldShS));

        cout << "Found " << ellipse_shapes.size() << " ellipse";
        if(ellipse_shapes.size() != 1) {
            cout << "s";
        }
        cout << endl;

        NEW_SHAPEVEC(line, LineData, select_type<LineData>(worldShS));

        if(line.empty()) {
            cout << "No lines" << endl;
        }
        line[0]->setInfinite();

        int left = 0;
        int right = 0;
        int centered = 0;
        for(std::vector<Shape<EllipseData> >::iterator it = ellipse_shapes.begin();
                it != ellipse_shapes.end(); ++it) {
            if(line[0]->pointIsLeftOf((*it)->getCentroid())) {
                ++left;
            } else if(line[0]->pointIsRightOf((*it)->getCentroid())) {
                ++right;
            } else {
                ++centered;
            }
        }
        cout << left << " ellipse";
        if(left != 1) {
            cout << "s";
        }
        cout << " to the left" << endl;

        cout << right << " ellipse";
        if(right != 1) {
            cout << "s";
        }
        cout << " to the right" << endl;

        cout << centered << " ellipse";
        if(centered != 1) {
            cout << "s";
        }
        cout << " are centered on the line" << endl;
    }

    $setupmachine {
        FindLineAndEllipses =C=> ReportEllipsesOnEachSide
    }
}

REGISTER_BEHAVIOR(LineEllipses);
