using UnityEngine;

public class MoveController : MonoBehaviour
{
    [SerializeField] private float _speed = 5f;

    private Rigidbody2D _rb;
    private Vector3 _moveTarget;
    private bool _hasTarget;

    void Awake() => _rb = GetComponent<Rigidbody2D>();

    public void SetSpeed(float speed) => _speed = speed;

    public void MoveDir(Vector2 dir)
    {
        _hasTarget = false;
        if (_rb != null && dir.sqrMagnitude > 0.001f)
            #if UNITY_6000_0_OR_NEWER
            _rb.linearVelocity = dir.normalized * _speed;
            #else
            _rb.velocity = dir.normalized * _speed;
            #endif
    }

    public void MoveTo(Vector3 target)
    {
        _moveTarget = target;
        _hasTarget = true;
    }

    public void Stop()
    {
        _hasTarget = false;
        #if UNITY_6000_0_OR_NEWER
        if (_rb != null) _rb.linearVelocity = Vector2.zero;
        #else
        if (_rb != null) _rb.velocity = Vector2.zero;
        #endif
    }

    public bool ReachedTarget(Vector3 target, float threshold = 0.1f)
    {
        if (_rb == null) return true;
        return Vector2.Distance(_rb.position, (Vector2)target) < threshold;
    }

    void FixedUpdate()
    {
        if (!_hasTarget || _rb == null) return;

        Vector2 dir = (Vector2)_moveTarget - _rb.position;
        float dist = dir.magnitude;

        if (dist < 0.05f)
        {
            _rb.position = (Vector2)_moveTarget;
            #if UNITY_6000_0_OR_NEWER
            _rb.linearVelocity = Vector2.zero;
            #else
            _rb.velocity = Vector2.zero;
            #endif
            _hasTarget = false;
            return;
        }

        // Snap to target if step exceeds remaining distance
        float step = _speed * Time.fixedDeltaTime;
        if (step >= dist)
        {
            _rb.position = (Vector2)_moveTarget;
            #if UNITY_6000_0_OR_NEWER
            _rb.linearVelocity = Vector2.zero;
            #else
            _rb.velocity = Vector2.zero;
            #endif
            _hasTarget = false;
        }
        else
        {
            #if UNITY_6000_0_OR_NEWER
            _rb.linearVelocity = dir.normalized * _speed;
            #else
            _rb.velocity = dir.normalized * _speed;
            #endif
        }
    }
}
