﻿#include <cmath>

#include "Shooting/ImageManager.h"
#include "Shooting/Tuning/GameTuning.h"

#include "Shooting/EnemyShot.h"

namespace dxgame::shooting
{
    void EnemyShot::Spawn(const Vector2& startPosition, const Vector2& targetPosition)
    {
        position = startPosition;
        Vector2 direction = {
            targetPosition.x - position.x,
            targetPosition.y - position.y
        };
        float distance = std::sqrt(direction.x * direction.x + direction.y * direction.y);

        // 敵とプレイヤーの位置が異なるためdistanceは0にならない
        // 方向を長さ1にそろえ角度によらず同じ速さにする
        velocity = {
            direction.x / distance * tuning::enemyShot::Speed,
            direction.y / distance * tuning::enemyShot::Speed
        };
        isActive = true;
    }

    void EnemyShot::Update(float deltaTime)
    {
        if (!isActive)
            return;

        position.x += velocity.x * deltaTime;
        position.y += velocity.y * deltaTime;

        // Hitbox全体が画面外へ出た弾を再利用できる状態に戻す
        Rect hitbox = GetHitbox();
        if (hitbox.x + hitbox.width < 0.0f ||
            hitbox.x > tuning::ScreenWidth ||
            hitbox.y + hitbox.height < 0.0f ||
            hitbox.y > tuning::ScreenHeight)
            Deactivate();
    }

    void EnemyShot::Draw(const ImageManager& images) const
    {
        if (!isActive)
            return;

        images.Draw(ImageManager::Id::EnemyShot, GetDrawRect());
    }

    bool EnemyShot::IsActive() const
    {
        return isActive;
    }

    void EnemyShot::Deactivate()
    {
        isActive = false;
    }

    Rect EnemyShot::GetDrawRect() const
    {
        return tuning::enemyShot::DrawRect.MovedBy(position);
    }

    Rect EnemyShot::GetHitbox() const
    {
        return tuning::enemyShot::Hitbox.MovedBy(position);
    }
}
