using Koptilnya.StateMachine;
using Mirror;
using UnityEngine;
using UnityEngine.AI;

namespace Characters.Enemy.States
{
    public class PatrolState : State<EnemyState>
    {
        private readonly Enemy _enemy;
        private NavMeshTriangulation _navMeshData;
        
        public PatrolState(Enemy enemy) : base(EnemyState.Patrol)
        {
            _enemy = enemy;
            _navMeshData = NavMesh.CalculateTriangulation();
                //NavMeshTriangulator.Data;
        }

        [ServerCallback]
        public override void Enter()
        {
            _enemy.SetSpeedMul(1f);
        }

        [ServerCallback]
        public override void Update()
        {
            _enemy.targetTransform = _enemy.GetClosestTarget();

            if (_enemy.HasTarget)
            {
                _enemy.ChangeState(EnemyState.Chase);

                return;
            }
            
            var remainingDistance = _enemy.agent.GetPathRemainingDistance();
            var invalidPath = _enemy.agent.pathStatus != NavMeshPathStatus.PathComplete;
            
            if (remainingDistance <= 1.5f || invalidPath)
            {
                SetRandomDestination();
            }
        }

        [Server]
        void SetRandomDestination()
        {
            if (!_enemy.agent.isOnNavMesh) return;
            
            _enemy.agent.destination = GetRandomLocation();
        }
        
        [Server]
        Vector3 GetRandomLocation()
        {
            // NavMeshTriangulation navMeshData = NavMesh.CalculateTriangulation();
            return _navMeshData.vertices[_navMeshData.indices[Random.Range(0, _navMeshData.indices.Length - 3)]];
        }
    }
}