// main.c   -   simulation main driver

#include "stream.h"
#include "sim.h"
#include "direction.h"
#include "vehicle.h"
#include "roadlet.h"
#include "check_functions.h"
#include "intersection.h"
#include <cstdlib>

#if defined(__XS1B__)
#include "xcoretestsuite.h"
#endif

// connect r1->d1 to r2->d2
void connect(roadlet *r1, direction d1, 
	     roadlet *r2, direction d2, 
	     roadlet* (*r1_to_r2_filter_function)(roadlet *, vehicle *, direction))
{
    //cout << "connecting " << *r1 << " " << *r2 << '\n';
    r1->set_neighbor(d1, r2);
    r2->set_neighbor(d2, r1);
    r1->set_move_filter_function(d1, r1_to_r2_filter_function);
}

int main()
{
    car c("fred");
    roadlet *r1, *r2;
    roadlet *r3, *r4;
    char *buff;
    int i;

    srandom(5);

    // build a two lane one direction road

    r1 = new roadlet ("R start");
    r3 = new roadlet ("L start");
    connect(r1, W, r3, E, return_null); // there but can't move to

    c.set_location(r1);		// a car
    r1->arrive(&c);

    for(i=0; i<10; i++)
    {
	buff = (char *)malloc(4);
	sprintf(buff, "R%d", i);
	r2 = new roadlet(buff);

	buff = (char *)malloc(4);
	sprintf(buff, "L%d", i);
	r4 = new roadlet(buff);

        connect(r1, N, r2, S, &::is_empty);
        connect(r3, N, r4, S, &::is_empty);
        connect(r1, NW, r4, SE, &lane_switch_ok);
        connect(r3, NE, r2, SW, &lane_switch_ok);
        connect(r2, W, r4, E, return_null); // can't more sideways

	r1 = r2;
	r3 = r4;
    }

    car b2("blocker 2");
    b2.set_location(r1);		// a car
    r1->arrive(&b2);
    cout << b2 << '\n';

    intersection_4x4 i1("intersection ");

    i1.connectSin(r3, r1);

    broken_light l(3,1,4,1);

    for(i = 0; i < 100000; i++)
    {
	//cout << l << "\n";
	l.tick();
    }

    for(i=0; i< 100000; i++)
    {
        i1.get_light()->tick();
    }


    r1 = new roadlet ("East Road R ");
    r3 = new roadlet ("East Road L ");
    connect(r1, N, r3, S, return_null); // there but can't move to

    car b("blocker");
    b.set_location(r1);		// a car
    r1->arrive(&b);
    cout << b << '\n';

    i1.connectEout(r3, r1);

    for(i=0; i< 100000; i++)
    {
        //cout << '\n' << i << ' ' << c << '\n';
        c.tick();
    }
    //cout << i << ' ' << c << '\n';
}
