#include "Enemyprojectile.hpp"
#include "Platform.hpp"
#include "Level.hpp"

EnemyProjectile::EnemyProjectile(float x, float y, enum direction dir)
    : Projectile(x,y,dir)
{
};
static StaticPixelBuffer<3,3> constexpr Psprite= {
    {{
        {" 2 "},
        {"222"},
        {" 2 "}
    }}};
const PixelBuffer& EnemyProjectile::getSprite()
{
    return Psprite;
};
bool EnemyProjectile::move(FloatSeconds const & Frametime, Level &level)
{
    int speed = 15;
    const auto &sprite = this->getSprite();
    switch (this->dir)
    {
        case direction::BACK: //down
            if(!level.checkCollision(this->x, this->y - 3*Frametime.count(), sprite.w(), sprite.h()))
            {
               this->y -= speed*Frametime.count();
                if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h())
                        || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h()))
                {
                    //Player hit
                    return false;
                }
             }
             else
             {
                 return false;
             }
             break;

            break;
        case direction::LEFT:
        if(!level.checkCollision(this->x - 3*Frametime.count(), this->y, sprite.w(), sprite.h()))
        {
           this->x -= speed*Frametime.count();
            if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h())
                    || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h()))
            {
                //Player hit
                return false;
            }
         }
         else
         {
             return false;
         }
         break;

            break;
        case direction::RIGHT:
            if(!level.checkCollision(this->x + 3*Frametime.count(),this->y, sprite.w(), sprite.h()))
            {
               this->x += speed*Frametime.count();
                if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h())
                        || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h()))
                {
                    //Player hit
                    return false;
                }
             }
             else
             {
                 return false;
             }
             break;

            break;
        default:
            if(!level.checkCollision(this->x, this->y + 3*Frametime.count(), sprite.w(), sprite.h()))
            {
               this->y += speed*Frametime.count();
               if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h())
                       || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h()))
               {
                   //Player hit
                   return false;
               }
            }
            else
            {
                return false;
            }
            break;
    }
    return true;
};

bool EnemyProjectile::doStep(const FloatSeconds &Frametime, Level &level)
{
    return move(Frametime,level);
};