using System;
using UnityEngine;
namespace HQFPSWeapons
{
    public class GunSettings
    {
		[Serializable]
		public class Shooting
		{
			[BHeader("General Settings")]
			[Tooltip("The layers that will be affected when you fire.")]
			public LayerMask Mask;
			[Tooltip("If something is farther than this distance threeshold, it will not be affected by the shot.")]
			public float MaxDistance = 150f;
			[Range(1, 20)]
			[Tooltip("The amount of rays that will be sent in the world " +
				"(basically the amount of projectiles / bullets that will be fired at a time).")]
			public int RayCount = 1;
			public HitscanImpact RayImpact;
			[Range(0f, 2f)]
			public float AimThreeshold = 0.35f;
			[BHeader("Ray Spread")]
			[Tooltip("How the bullet spread will transform (in continuous use) on the duration of the magazine, the max x value(1) will be used if the whole magazine has been used")]
			public AnimationCurve SpreadOverTime = new AnimationCurve(
				new Keyframe(0f, .8f),
				new Keyframe(1f, 1f));
			[Range(0f, 3f)]
			public float AimSpreadFactor = 0.8f;
			[Range(0f, 3f)]
			public float CrouchSpreadFactor = 0.95f;
			[Range(0f, 3f)]
			public float WalkSpreadFactor = 0.95f;
			[Range(0f, 3f)]
			public float RunSpreadFactor = 0.95f;
			[Range(0f, 3f)]
			public float JumpSpreadFactor = 1.5f;
		}
		[Serializable]
		public class HitscanImpact
		{
			[Range(0f, 1000f)]
			[SerializeField]
			[Tooltip("The damage at close range.")]
			private float m_MaxDamage = 15f;
			[Range(0f, 1000f)]
			[SerializeField]
			[Tooltip("The impact impulse that will be transfered to the rigidbodies at contact.")]
			private float m_MaxImpulse = 15f;
			[SerializeField]
			[Tooltip("How damage and impulse lowers over distance.")]
			private AnimationCurve m_DistanceCurve = new AnimationCurve(
				new Keyframe(0f, 1f),
				new Keyframe(0.8f, 0.5f),
				new Keyframe(1f, 0f));
			/// 
			/// 
			/// 
			/// 
			/// 
			public float GetDamageAtDistance(float distance, float maxDistance)
			{
				return ApplyCurveToValue(m_MaxDamage, distance, maxDistance);
			}
			/// 
			/// 
			/// 
			/// The impulse at distance.
			/// Distance.
			/// Max distance.
			public float GetImpulseAtDistance(float distance, float maxDistance)
			{
				return ApplyCurveToValue(m_MaxImpulse, distance, maxDistance);
			}
			private float ApplyCurveToValue(float value, float distance, float maxDistance)
			{
				float maxDistanceAbsolute = Mathf.Abs(maxDistance);
				float distanceClamped = Mathf.Clamp(distance, 0f, maxDistanceAbsolute);
				return value * m_DistanceCurve.Evaluate(distanceClamped / maxDistanceAbsolute);
			}
		}
	}
}