using Koptilnya.StateMachine;
using Mirror;
using UnityEngine;

namespace Characters.Enemy.States
{
    public class ChaseState : State<EnemyState>
    {
        private readonly Enemy _enemy;
        private readonly AudioClip _agressiveClip;

        public ChaseState(Enemy enemy) : base(EnemyState.Chase)
        {
            _enemy = enemy;
            _agressiveClip = Resources.Load<AudioClip>("Audio/EnemySounds/FX/agressive2");
        }
        
        public override void Enter()
        {
            if (_enemy.isServer)
            {
                _enemy.SetSpeedMul(1f);
                _enemy.SetAimRigWeight(1f);
            }

            if (_enemy.isClient)
            {
                _enemy.audioSource.clip = _agressiveClip;
                _enemy.audioSource.loop = true;
                _enemy.audioSource.Play();
            }
        }

        [ServerCallback]
        public override void Update()
        {
            _enemy.agent.destination = _enemy.targetTransform.position;

            var distanceToTarget = _enemy.DistanceToTarget;
            
            if (distanceToTarget < _enemy.aggressionDistance)
            {
                _enemy.aimTransform.position = _enemy.targetTransform.position + _enemy.targetTransform.up * 1.2f;
                
                if (distanceToTarget < 1f)
                {
                    _enemy.ChangeState(EnemyState.Attack);

                    return;
                }
                
                _enemy.targetTransform = _enemy.GetClosestTarget();
            }

            if (!_enemy.HasTarget)
            {
                _enemy.ChangeState(EnemyState.Idle);
            }
        }

        public override void Exit()
        {
            if (_enemy.isServer)
            {
                _enemy.SetAimRigWeight(0f);
            }
            
            if (_enemy.isClient)
            {
                _enemy.audioSource.loop = false;
                _enemy.audioSource.Stop();
            }
        }
    }
}