#include "Enemy.hpp"
#include "Level.hpp"
#include "Enemyprojectile.hpp"
//WeberMa73121: implementation enum direction dir replaces int direcion---------------------------------------
//Hauerch71498 ----------------------------------------------------------------------------------------------
Enemy::Enemy(int health,float x, float y, enum direction dir, int animationstep)
{
    this->hitpoints = health;
    this->topleft = { x, y };
    this->dir = dir;
    this->animationstep = animationstep;
}

void Enemy::shoot(Level &level)
{
    const auto &sprite = this->getSprite();
    if(timetillreload<0)
    {
        switch ( this->dir ) {
        case direction::FRONT: //Up
        {
            level.addEnemyProjectile({this->topleft.X+sprite.w()/2-1,this->topleft.Y+sprite.h()/2,dir});
            break;
        }
        case direction::LEFT: //left
            level.addEnemyProjectile({this->topleft.X,this->topleft.Y+sprite.h()/2,dir});
            break;
        case direction::RIGHT: //right
            level.addEnemyProjectile({this->topleft.X+sprite.w(),this->topleft.Y+sprite.h()/2,dir});
            break;
        default: //Down
            level.addEnemyProjectile({this->topleft.X+sprite.w()/2-1,this->topleft.Y,dir});
            break;
        }
        timetillreload = 5;
    }
};

void Enemy::move(
    [[maybe_unused]] FloatSeconds const & Frametime,
    [[maybe_unused]] Level &level
)
{

};

bool Enemy::lookup(float PlayerY, Level &level)
{
    if(this->topleft.Y > PlayerY)
    {
        int i = static_cast<int>(this->topleft.Y-(this->getSprite().h()/2));
        i = i-static_cast<int>(PlayerY);
        if(level.checkCollision(this->topleft.X, this->topleft.Y+(this->getSprite().h()/2)+i, i, 1))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
};
bool Enemy::lookdown(float PlayerY, Level &level)
{
    if(this->topleft.Y < PlayerY)
    {
        int i = static_cast<int>(this->topleft.Y+(this->getSprite().h()/2));
        i = static_cast<int>(PlayerY)-i;
        if(level.checkCollision(this->topleft.X, this->topleft.Y+(this->getSprite().h()/2), i, 1))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
};
bool Enemy::lookleft(float PlayerX, Level &level)
{
    if(this->topleft.X > PlayerX)
    {
        int i = static_cast<int>(this->topleft.X-(this->getSprite().w()/2));
        i = i-static_cast<int>(PlayerX);
        if(level.checkCollision(this->topleft.X-(this->getSprite().w()/2)-i, this->topleft.Y, i, 1))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
};
bool Enemy::lookright(float PlayerX, Level &level)
{
    if(this->topleft.X < PlayerX)
    {
        int i = static_cast<int>(this->topleft.X+(this->getSprite().w()/2));
        i = static_cast<int>(PlayerX)-i;
        if(level.checkCollision(this->topleft.X-(this->getSprite().w()/2), this->topleft.Y, i, 1))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
};

bool Enemy::lookAtPlayer(float PlayerX, float PlayerY, Level &level)
{
    switch (dir) {
    case direction::BACK: //back
        return lookup(PlayerY, level);
        break;
    case direction::LEFT: //left
        return lookleft(PlayerX, level);

        break;
    case direction::RIGHT: //right
        return lookright(PlayerX, level);
        break;
    default:
        return lookdown(PlayerY, level);
        break;
    }
}

bool Enemy::playerdetected(float PlayerX, float PlayerY, Level &level)
{
        if(abs(this->topleft.X - PlayerX) < 20) //buffer of 5
        {
            if(lookdown(PlayerY, level))
            {
                dir = direction::FRONT;
                return true;
            }
            else if(lookup(PlayerY, level))
            {
                dir = direction::BACK;
                return true;
            }
            else
            {
                return false;
            }
        }
        else if(abs(this->topleft.Y - PlayerY) < 20) //buffer of 5
        {
            if(lookleft(PlayerX, level))
            {
                dir = direction::LEFT;
                return true;
            }
            else if(lookright(PlayerX, level))
            {
                dir = direction::RIGHT;
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
};