/*===========================================
            Plant and fireworks
              Martin Robinson
                tree object
===========================================*/

#include "doddle.hpp"

void doddle::init(int x, int y)
{
    _start.init(x,y);
    _start.rotate(-3.1415);
    _turtle.init(_start);
    _path = "aaa++++aa----aa+++++[----------aa]++++++aaraaa";
    _index = 0;
}

int doddle::x()
{
    return _turtle.x();
}

int doddle::y()
{
    return _turtle.y();
}

int doddle::len()
{
    return _path.length();
}

char doddle::get()
{
    return _path[_index];
}

bool doddle::end()
{
    return _index >= _path.length();
}

void doddle::reset()
{
    _index = 0;
    _turtle.init(_start);
    while(!_stack.empty())
        _stack.pop();
}

void doddle::next()
{
    _index++;
}

void doddle::parse()
{
    switch(_path[_index])
    {
        case 'a':
            _turtle.stroke();
            break;
        case '+':
            _turtle.rotate(radianStep);
            break;
        case '-':
            _turtle.rotate(-radianStep);
            break;
        case '[':
            _stack.push(_turtle);
            break;
        case ']':
            _turtle = _stack.top();
            _stack.pop();
            break;
        case 'r':
            _turtle.resetRad();
            _turtle.rotate(3.1415);
            break;
    }
}

int doddle::index()
{
    return _index;
}

void doddle::insert(string addition)
{
    if (_index<_path.length()-1)
        _path.insert(_index+1,addition);
    else
        _path.append(addition);
}

void doddle::pathTo(int mx, int my)
{
    float r = -atan2((float)my-_turtle.y(),(float)mx-_turtle.x())+3.1415/2;
    string addition = "[r";
    int cnt = 3;
    float i=0;        
    if (r>0)
    {
        while(i<r)
        {
            addition.append("+");
            i+=radianStep;
            cnt++;
        }
    }
    else if (r<0)
    {
        while(i>r)
        {
            addition.append("-");
            i-=radianStep;
            cnt++;
        }
    }
    addition.append("a]");
    insert(addition);
    _touch+=cnt;
}

void doddle::touch()
{
    _touch = _index;
}

void doddle::unTouch()
{
    _touch = 0;
}

bool doddle::isTouch()
{
    return _touch!=0;
}

bool doddle::atTouch()
{
    return isTouch() && _index == _touch;
}

//-------------------------------test code-------------------------------
//#include "SDL/SDL.h"
//
//#include <fstream>
//#include <iostream>
//
//using namespace std;
//
//int main(int argc, char * argv[])
//{
//
//    SDL_Init(SDL_INIT_EVERYTHING);
//    SDL_Surface *screen = SDL_SetVideoMode(600, 400, 8, SDL_SWSURFACE);
//    SDL_Event event;
//
//    int keypress = 0,
//        mx = 0,
//        my = 0,
//        mb = 0,
//        dx = 0,
//        dy = 0,
//        mt = 0;
//        
//    Uint32 brown = SDL_MapRGB( screen->format, 0x66, 0x33, 0x00 ),
//           red = SDL_MapRGB( screen->format, 0xFF, 0x00, 0x00 ),
//           black = SDL_MapRGB( screen->format, 0x00, 0x00, 0x00 );
//           
//    doddle roots;
//    roots.init(300,100);
//           
//    while(!keypress)
//    {
//        SDL_Flip(screen);
//        SDL_FillRect(screen,0,brown);
//
//        while(SDL_PollEvent(&event))
//        {
//            switch (event.type)
//            {
//                case SDL_QUIT:
//                    keypress = 1;
//                    break;
//                case SDL_KEYDOWN:
//                    keypress = 1;
//                    break;
//                case SDL_MOUSEMOTION:
//                    mx = event.motion.x;
//                    my = event.motion.y;
//                    break;
//                case SDL_MOUSEBUTTONDOWN:
//                    if (roots.isTouch())
//                        mb = 1;
//                    break;
//                case SDL_MOUSEBUTTONUP:
//                    mb = 0;
//                    roots.unTouch();
//                    break;
//            }
//        }
//
//        roots.reset();
//        while (!roots.end())
//        {
//            roots.parse();
//
//            SDL_Rect tmp = {roots.x(), roots.y(),8,8};
//            
//            if (tmp.x<mx && tmp.x+tmp.w>mx && tmp.y<my && tmp.y+tmp.h>my )
//            {
//                roots.touch();
//                SDL_FillRect(screen, &tmp, red);
//            }
//            else if (mb && roots.atTouch())
//            {
//                if (pow(mx-roots.x(),2)+pow(my-roots.y(),2)<400)
//                    SDL_FillRect(screen, &tmp, red);
//                else
//                {
//                    roots.pathTo(mx,my);
//                }
//            }
//            else
//            {
//                SDL_FillRect(screen, &tmp, black);
//            }
//            
//            roots.next();
//        }
//
//
//    }
//    SDL_Quit();
//    return 0;
//}
////-----------------------------------------------------------------------------*/
