using UnityEngine;
using UnityEngine.AI; // Required for NavMeshAgent

public class Movement_Ground : Movement_Base
{
    // Awake 메서드를 오버라이드하여 NavMeshAgent를 가져옵니다.
    protected override void Awake()
    {
        base.Awake(); // BaseMovement의 Awake 호출
        _agent = GetComponent<NavMeshAgent>();
        if (_agent == null)
        {
            Debug.LogError("GroundMovement requires a NavMeshAgent component on the same GameObject!");
        }
    }

    public override void SetSpeed(float speed)
    {
        if (_agent != null) _agent.speed = speed;
    }

    // BaseMovement의 SetDestination 추상 메서드를 구현합니다.
    public override void SetDestination(Vector3 target)
    {
        if (_agent != null && _agent.isOnNavMesh)
        {
            _agent.isStopped = false; // 목적지 설정 전 에이전트가 멈춰있지 않도록 합니다.
            _agent.SetDestination(target);
        }
    }

    // BaseMovement의 Stop 추상 메서드를 구현합니다.
    public override void Stop()
    {
        if (_agent != null && _agent.isOnNavMesh)
        {
            _agent.isStopped = true; // 에이전트를 명시적으로 멈춥니다.
        }
    }

    // BaseMovement의 GetCurrentSpeed 추상 메서드를 구현합니다.
    public override float GetCurrentSpeed()
    {
        return (_agent != null) ? _agent.velocity.magnitude : 0f;
    }

    // BaseMovement의 IsMoving 추상 메서드를 구현합니다.
    public override bool IsMoving()
    {
        if (_agent == null || !_agent.isOnNavMesh) return false;

        // 에이전트가 멈춰있지 않고, 경로가 있으며, 남은 거리가 stoppingDistance보다 크면 이동 중으로 간주합니다.
        return !_agent.isStopped && _agent.hasPath && _agent.remainingDistance > _agent.stoppingDistance;
    }

    // Update 메서드에서 도착 체크 로직을 처리합니다.
    void Update()
    {
        // 에이전트가 이동 중일 때만 도착 체크를 수행합니다.
        if (IsMoving())
        {
            // 경로 계산이 완료되었고, 남은 거리가 stoppingDistance 이하면 도착으로 간주합니다.
            if (!_agent.pathPending && _agent.hasPath && _agent.remainingDistance <= _agent.stoppingDistance)
            {
                Stop(); // 도착했으므로 에이전트를 멈춥니다.
            }
        }
    }
}