#include "Arduino.h"

class Player
{
  public:
    Player(int, int, int);
    int Id() const;
    int Lives() const;
    void Lives(int);
    bool Alive() const;
    void Kill();
    void setColor(int, int, int);
    void moveby(int);
    void moveto(int);
    void Spawn(int);
    void updateState(bool tilted, bool wobbled, int time);
    void startAttack(int time);
    // public variables
    int position;
    int speed;
    bool attacking;
    bool captured;
    int last_attack;
    int color[3];
  private:
    int _id;
    int _lives;
    int _state;
    int _lastState; // 0-> idle;  1-> move; 2 -> attack
    int _attackDuration;
};

Player::Player(int id, int lives, int attackDuration){
    _lives = lives;
    _id = id;

    attacking = false;
    _attackDuration = attackDuration;

    _lastState = 0; // start as idle;

    captured = false;
}

void Player::setColor(int r, int g, int b){
    color[0] = r;
    color[1] = g;
    color[2] = b;
}

int Player::Id() const
{
    return _id;
}

void Player::updateState(bool tilted, bool wobbled, int time) {

    // attack timed out
    if(attacking && last_attack+_attackDuration < time) attacking = false;

    // no longer attacking
    if (!wobbled) attacking = false;

    _lastState = 0;
    if (tilted) _lastState = 1; // moving
    if (wobbled) _lastState = 2; // attacking
}

void Player::startAttack(int time){
    // if already attacking just return
    if (attacking) return;

    // I got tired of attacking, I should be idle or moving for a little before attacking again.
    if (_lastState == 2) return;

    last_attack = time;
    attacking = true;
}

void Player::Lives(int n){
    _lives = n;
}

bool Player::Alive() const{
    return _lives > 0;
}

void Player::Kill(){
    captured = true;

    _lives--;
    if (_lives < 0) _lives = 0;
}

void Player::Spawn(int pos){
    if (_lives <= 0) {
        // Serial.printf("Player %d has no life. Not Spawning\n", _id);
        captured = true;
    } else {
        captured = false;
        moveto(pos);
    }
}

int Player::Lives() const{
    return _lives;
}

void Player::moveby(int amount){
    position += amount;
    if (position<0) position=0;
}

void Player::moveto(int amount){
    position = amount;
    if (position<0) position=0;
}
