using FishNet.Object;
using UnityEngine;

namespace FishNet.Demo.NetworkLod
{

    public class MoveRandomly : NetworkBehaviour
    {
        [SerializeField]
        private float _moveRate = 3f;
        //Colors green for client.
        [SerializeField]
        private Renderer _renderer;
        [SerializeField]
        private bool _updateRotation;

        //Maximum range for new position.
        private const float _range = 10f;
        //Position to move towards.
        private Vector3 _goalPosition;
        //Rotation to move towards.
        private Quaternion _goalRotation;
        //Position at spawn.
        private Vector3 _startPosition;



        private void Update()
        {
            //Client should not move these.
            if (base.IsClientOnly)
                return;
            //Server shouldn't move client one.
            if (base.Owner.IsValid)
                return;

            transform.position = Vector3.MoveTowards(transform.position, _goalPosition, _moveRate * Time.deltaTime);
            if (_updateRotation)
                transform.rotation = Quaternion.RotateTowards(transform.rotation, _goalRotation, 15f * Time.deltaTime);
            if (transform.position == _goalPosition)
                RandomizeGoal();
        }

        public override void OnStartNetwork()
        {
            _startPosition = transform.position;
            RandomizeGoal();

            if (_renderer != null && base.Owner.IsActive)
                _renderer.material.color = Color.green;

            if (!base.Owner.IsValid)
                gameObject.name = "LOD " + base.ObjectId;
            else
                gameObject.name = "Owned " + base.ObjectId;
        }

        private void RandomizeGoal()
        {
            _goalPosition = _startPosition + (Random.insideUnitSphere * _range);

            if (_updateRotation)
            {
                bool rotate = (Random.Range(0f, 1f) <= 0.33f);
                if (rotate)
                {
                    Vector3 euler = Random.insideUnitSphere * 180f;
                    _goalRotation = Quaternion.Euler(euler);
                }
                else
                {
                    _goalRotation = transform.rotation;
                }
            }
        }

    }

}