using UnityEngine;

namespace Movement
{
    [RequireComponent(typeof(Rigidbody2D))]
    public class EnemyMovement : MonoBehaviour, IMovement
    {
        protected Rigidbody2D _rigidbody2D = null;
        protected Vector2 gravityForce = Vector2.down;
        protected bool _isPaused = false;
        protected float moveValue = 0f;

        public float BaseSpeed { get; set; } = 1f;
        public bool IsPaused => _isPaused;

        protected virtual void Awake()
        {
            _rigidbody2D = GetComponent<Rigidbody2D>();

            _rigidbody2D.gravityScale = 0f;
            gravityForce *= -Physics2D.gravity.y * _rigidbody2D.mass;
        }

        protected virtual void FixedUpdate()
        {
            _rigidbody2D.AddRelativeForce(gravityForce);

            if (IsPaused)
                return;

            Vector2 velocity = transform.InverseTransformDirection(_rigidbody2D.velocity);
            velocity.x = moveValue;
            _rigidbody2D.velocity = transform.TransformDirection(velocity);
        }

        public void Move(float value)
            => moveValue = value * BaseSpeed;

        public void Pause()
        {
            _isPaused = true;
            UpdateRigidbody();
        }

        public void Resume()
        {
            _isPaused = false;
            UpdateRigidbody();
        }

        protected void UpdateRigidbody()
            => _rigidbody2D.simulated = !_isPaused;
    }
}
