#include "racecar.h"

Racecar::Racecar(float maxSpeed, float acceleration, float steerSpeed, sf::Color color)
    : maxSpeed(maxSpeed), acceleration(acceleration), steerSpeed(steerSpeed), dx(0), dy(0), steeringAngle(3.13) {
    if (!font.loadFromFile("cascaydia.otf")) {
        std::cerr << "Failed to load font" << std::endl;
        exit(1);
    }

    carText.setString("|:=:>"); // Replace "o" with a racecar emoji or any desired character
    carText.setFont(font);
    carText.setCharacterSize(12);
    carText.setFillColor(color);
    
    speed = 0;
}

void Racecar::update(float dt) {
    carText.move(speed * dt * cos(steeringAngle), speed * dt * sin(steeringAngle));
}

void Racecar::accelerate(float dt) {
    if (speed < maxSpeed) {
        speed += acceleration * dt;
    }
    else {
        decelerate(dt);
    }
}

void Racecar::decelerate(float dt) {
    if (speed < -1) {
        speed += 3 * acceleration * dt;
    } else if (speed > 1) {
        speed -= 3 * acceleration * dt;
    }
    else {
        speed = 0;
    }
}

void Racecar::steer(float dt, float direction) {
    steeringAngle += steerSpeed * direction * dt;
    carText.setRotation(steeringAngle * 180 / M_PI);
}

void Racecar::brake(float dt) {
    if (speed < -1) {
        speed += 9 * acceleration * dt;
    } else if (speed > 1) {
        speed -= 9 * acceleration * dt;
    }
    else {
        speed = 0;
    }
}

void Racecar::stop() {
    speed = 0;
}

void Racecar::reverse(float dt) {
    if (speed > -maxSpeed / 2) {
        speed -= 1.5 * acceleration * dt;
    }
}

sf::Text Racecar::getDrawable() {
    return carText;
}

void Racecar::setPosition(float x, float y) {
    carText.setPosition(x, y);
}

void Racecar::setRotation(float value) {
    carText.setRotation(value);
}

float Racecar::getRotation() {
    return steeringAngle;
}

float Racecar::getSpeed() const {
    return speed;
}

float Racecar::getX() const {
    return carText.getPosition().x;
}

float Racecar::getY() const {
    return carText.getPosition().y;
}

void Racecar::boost(float dt) {
    if (speed < maxSpeed * 2) {
        speed += (acceleration * dt) * 5;
    }
}