/**
* Copyright (C) Kevin J. Estevez (kenystev) and Luis C. Isaula (lisaula)
*
* GNU GENERAL PUBLIC LICENSE Version 2
* The licenses for most software are designed to take away your
* freedom to share and change it.  By contrast, the GNU General Public
* License is intended to guarantee your freedom to share and change free
* software--to make sure the software is free for all its users.  This
* General Public License applies to most of the Free Software
* Foundation's software and to any other program whose authors commit to
* using it.
*/

#include "Car.h"

Car::Car(RosalilaGraphics *p, string image)
{
    painter = p;
    state["ahead"] = p->getTexture("assets/"+image+"_ahead.png");
    state["left"] = p->getTexture("assets/"+image+"_left.png");
    state["right"] = p->getTexture("assets/"+image+"_right.png");

    car = state["ahead"];

    velocimeter_state["first"] = p->getTexture(assets_directory+"Velocimeter_1.png");
    velocimeter_state["second"] = p->getTexture(assets_directory+"Velocimeter_2.png");
    velocimeter_state["third"] = p->getTexture(assets_directory+"Velocimeter_3.png");
    velocimeter_state["fourth"] = p->getTexture(assets_directory+"Velocimeter_4.png");
    velocimeter_state["fifth"] = p->getTexture(assets_directory+"Velocimeter_5.png");

    warning.push_back(p->getTexture(assets_directory+"Warnig_1.png"));
    warning.push_back(p->getTexture(assets_directory+"Warnig_2.png"));
    warning.push_back(p->getTexture(assets_directory+"Warnig_3.png"));
    warning.push_back(p->getTexture(assets_directory+"Warnig_4.png"));

    marker = p->getTexture(assets_directory+"Indicador.png");
    velocimeter = velocimeter_state["first"];
    G_over=painter->getTexture(assets_directory+"Gameover.png");
    x = p->screen_width*0.5 - car->getWidth()*0.5;
    y = p->screen_height - car->getHeight();
    scale=1;
    marker_x = 114;
    marker_y = 614;
    marker_y_max = 201;

    wheels.w = car->getWidth()*0.9;
    wheels.h = car->getHeight()*0.15;
    wheels.x = (car->getWidth())*0.5 - wheels.w*0.5;
    wheels.y = (y+car->getHeight()) - wheels.h;

    marker_speed =0;
    a=0.2;
    v=0;
    maximum = 15;
    v_max=0;
    first = false, second = false,third = false,fourth = false,fifth = false, speed_up = false,danger= false, lose = false;
    warning_actual=0;
    off_set_x=0,cambio =0;
    CHANGE_TURN=13;
    TURN=CHANGE_TURN;
    outOfRoad=false;
    hurt=0;
    time=0;
}
Car::Car(){
    //nada
}

Car::~Car()
{
    delete painter;
    delete car;
    delete velocimeter;
    delete marker;
    delete G_over;
}

void Car::initCar()
{
    marker_speed =0;
    cambio =0;
    v=0;
    car = state["ahead"];
    velocimeter = velocimeter_state["first"];
    v_max=0;
    first = false, second = false,third = false,fourth = false,fifth = false, speed_up = false,danger= false, lose = false;
    warning_actual=0;
    off_set_x=0;
    TURN=CHANGE_TURN;
    outOfRoad=false;
    hurt=0;
    time=0;
    marker_x = 114;
    marker_y = 614;
    marker_y_max = 201;
}

void Car::warningAnimation(){
        painter->draw2DImage(warning[warning_actual],
                            warning[warning_actual]->getWidth(),warning[warning_actual]->getHeight(),
                            103,150,
                            scale,
                            0,false,
                            0,0,
                            Color(255,255,255,255),
                            0,0,
                            false);
        if(painter->frame%6==0)
            warning_actual++;
        if(warning_actual>=warning.size()){
            warning_actual=0;
            time++;
        }
}
void Car::update(Receiver *r)
{
    if(r->isKeyDown(SDL_SCANCODE_DOWN) || r->isJoyDown(4,0))
    {
        speed_up = false;
        if(v>0)
            v-=a*2;
        else
            v=0;
    }else
    if(r->isKeyDown(SDL_SCANCODE_UP) || r->isJoyDown(1,0))
    {
        speed_up = true;
        if(hurt==0)
        {
           if(first || second || third || fourth || fifth){
                if(v<=v_max)
                {
                    v+=a;
                }
                else
                    v-=a*2;
            }

        }
        else
        {
            speed_up = false;
            v=hurt;
        }
    }else{
        speed_up = false;
        if(v>0)
            v-=a;
        else
            v=0;
    }

    car = state["ahead"];
    if(r->isKeyPressed(SDLK_a)){
        if(cambio<5){
            cambio++;
        }
    }


    if(r->isKeyPressed(SDLK_z)){
        if(cambio>1){
            cambio--;
        }
    }

    if(cambio==1){
        second=false,third=false,fourth =false,fifth =false;
        velocimeter = velocimeter_state["first"];
        v_max = maximum *0.20;
        marker_speed =6;
        if(!first){
            marker_y = 614;
            first = true;
        }
    }
    else if(cambio==2){
        first = false,third=false,fourth =false,fifth =false;
        velocimeter= velocimeter_state["second"];
        v_max = maximum *0.40;
        marker_speed =5;
        if(!second){
        marker_y = 554;
        second=true;
        }
    }
    else if(cambio==3){
        second=false,first=false,fourth =false,fifth =false;
        velocimeter= velocimeter_state["third"];
        v_max = maximum *0.60;
        marker_speed =4;
        if(!third){
            marker_y = 474;
            third = true;
        }
    }
    else if(cambio==4){
        third = false,second=false,first=false,fifth =false;
        velocimeter= velocimeter_state["fourth"];
        v_max = maximum *0.80;
        marker_speed =3;
        if(!fourth){
            marker_y = 404;
            fourth = true;
        }
    }
    else if(cambio==5){
        fourth = false,second=false,third=false,first =false;
        velocimeter= velocimeter_state["fifth"];
        v_max = maximum;
        marker_speed =3;
        if(!fifth){
            marker_y = 314;
            fifth = true;
        }
    }
    if(speed_up && !outOfRoad){
        if(marker_y>marker_y_max)
            marker_y-=marker_speed;
    }else{
        if(marker_y<614){
            marker_y+=marker_speed*2;
        }else
            marker_y=614;
    }
    if(danger){
        if(time>15){
            lose=true;
        }
    }else
        time=0;

    turn=false;
    hurt=0;
    if(v>0){
        if((r->isKeyDown(SDL_SCANCODE_RIGHT)  || r->isJoyDown(-6,0))&& off_set_x>-850)
        {
            turn=true;
            TURN=-CHANGE_TURN;
            off_set_x+=TURN;
            car = state["right"];
        }
        if((r->isKeyDown(SDL_SCANCODE_LEFT)  || r->isJoyDown(-4,0)) && off_set_x<850)
        {
            turn=true;
            TURN=CHANGE_TURN;
            off_set_x+=TURN;
            car = state["left"];
        }
        if(outOfRoad)
        {
            if(v>a)
                v-=a*2;
            else
                v=a;
            outOfRoad=false;
        }
    }
}

bool Car:: getLose(){
    return lose;
}

void Car::draw()
{
    wheels.x = (x+car->getWidth())*0.5 + wheels.w*0.465;

    painter->draw2DImage(   car,
                            car->getWidth(),car->getHeight(),
                            x,y,
                            scale,
                            0,false,
                            0,0,
                            Color(255,255,255,255),
                            0,0,
                            false);
        painter->draw2DImage(velocimeter,
                            velocimeter->getWidth(),velocimeter->getHeight(),
                            50,145,
                            scale,
                            0,false,
                            0,0,
                            Color(255,255,255,255),
                            0,0,
                            false);
        painter->draw2DImage(marker,
                            marker->getWidth(),marker->getHeight(),
                            marker_x,marker_y,
                            scale,
                            0,false,
                            0,0,
                            Color(255,255,255,255),
                            0,0,
                            false);
        if((first && marker_y<=364)||(second && marker_y<=310)
        || (third && marker_y>=544)||(fourth && marker_y>=364)
        || (fifth && marker_y>=330)){
            warningAnimation();
            danger = true;
            if(lose)
                painter->draw2DImage(G_over,
                        G_over->getWidth(),G_over->getHeight(),
                        93,84,1,
                        0,false,
                        0,0,
                        Color(255,255,255,255),
                        0,0,
                        false);
            }else
                danger = false;

    //Draw hitbox's car
//    painter->drawRectangle(wheels.x,wheels.y,wheels.w,wheels.h,
//                            0,255,0,0,255,false);
}