using UnityEngine;
using NeonTea.Quakeball.Players;

namespace NeonTea.Quakeball.Animation {
    /// <summary>Lags a little behind every frame to create a delay effect in the gun movement.</summary>
    public class GunInterpolator : MonoBehaviour {
        public LocalPlayer Player;
        public float InterpolationSpeed;
        public float YawDegrees;
        public float PitchDegrees;
        public float RollDegrees;
        public float RotationThreshold;

        private Vector2 CurrentLean = Vector2.zero;
        private Vector2 TargetLean = Vector2.zero;

        private void Awake() {
            transform.parent = Player.Camera;
        }

        private void Update() {
            Vector2 LookDelta = Player.LookAction.ReadValue<Vector2>();
            SetTarget(LookDelta.x, ref TargetLean.x);
            CurrentLean.x = Mathf.Lerp(CurrentLean.x, TargetLean.x, InterpolationSpeed * Time.deltaTime);
            SetTarget(LookDelta.y, ref TargetLean.y);
            CurrentLean.y = Mathf.Lerp(CurrentLean.y, TargetLean.y, InterpolationSpeed * Time.deltaTime);

            Vector3 Eulers = transform.localEulerAngles;
            Eulers.x = -CurrentLean.y * PitchDegrees;
            Eulers.y = CurrentLean.x * YawDegrees;
            Eulers.z = CurrentLean.x * RollDegrees;
            transform.localEulerAngles = Eulers;
        }

        private void SetTarget(float delta, ref float targetLean) {
            if (delta > RotationThreshold) {
                targetLean = -1;
            } else if (delta < -RotationThreshold) {
                targetLean = 1;
            } else {
                targetLean = Mathf.Lerp(targetLean, 0, 10f * Time.deltaTime);
            }
        }
    }
}
