#include "../H/player.h"

Player::Player(const Vector3f & position, float rotx, float roty) : m_rotx(rotx), m_roty(roty), m_pos(position){
    m_health = 100.f;
    std::cout << "Constructor" << std::endl;
}

Vector3f Player::Position(){
    return m_pos;
}

void Player::TurnCamera(float x, float y){
    x *= 0.01;
    y *= 0.01;

    if(m_rotx + y >= -70 && m_rotx + y <= 70)
        m_rotx += y;
    m_roty += x;
}

void Player::SetPosition (Vector3f delta){
    m_pos.x = delta.x;
    m_pos.y = delta.y;
    m_pos.z = delta.z;
}

Vector3f Player::SimulateMove ( bool front , bool back , bool left , bool right , bool run, float elapsedTime ){
    Vector3f delta(0, 0, 0);
    double speed = 0.1;
    if(run)
        speed = 0.2;
    if (front){
        float yrotrad = (m_roty / 180 * 3.141592654f);
        delta.x += float(sin(yrotrad)) * speed;
        delta.z -= float(cos(yrotrad)) * speed;
    }
    if (back){
        float yrotrad = (m_roty / 180 * 3.141592654f);
        delta.x -= float(sin(yrotrad)) * speed;
        delta.z += float(cos(yrotrad)) * speed;
    }
    if (left){
        float yrotrad = (m_roty / 180 * 3.141592654f);
        delta.x -= float(cos(yrotrad)) * speed;
        delta.z -= float(sin(yrotrad)) * speed;
    }
    if(right){
        float yrotrad = (m_roty / 180 * 3.141592654f);
        delta.x += float(cos(yrotrad)) * speed;
        delta.z += float(sin(yrotrad)) * speed;
    }
    return delta;
}

float Player::SimulateJump(bool jump, bool& InJump, float& deltay, bool OnGround, float& jumpsize){
    if(jump){
        if (OnGround)
        {
            InJump = true;
        }
    }
    if(InJump){
        deltay += 0.2;
        if (jumpsize > 1.5)
        {
            InJump = false;
            return -1.5;
        }
        return 0.1;
    }
    return 0;
}

void Player::ApplyTransformation ( Transformation & transformation ) const{
    transformation.ApplyRotation(-m_rotx, 1.f, 0, 0);
    transformation.ApplyRotation(-m_roty, 0, 1.f, 0);
    transformation.ApplyTranslation(-m_pos);
} 

void Player::Damage(Mob& mob){
    mob.setHealth(mob.Health() - m_damage);
}

float Player::Health(){
    return m_health;
}

void Player::setHealth(float health){
    m_health = health;
}