using System;
using HG;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.Serialization;

namespace RoR2.CharacterAI;

public class AISkillDriver : MonoBehaviour
{
	public enum TargetType
	{
		CurrentEnemy,
		NearestFriendlyInSkillRange,
		CurrentLeader,
		Custom
	}

	public enum AimType
	{
		None,
		AtMoveTarget,
		AtCurrentEnemy,
		AtCurrentLeader,
		MoveDirection
	}

	public enum MovementType
	{
		Stop,
		ChaseMoveTarget,
		StrafeMovetarget,
		FleeMoveTarget
	}

	public enum ButtonPressType
	{
		Hold,
		Abstain,
		TapContinuous
	}

	[Tooltip("The name of this skill driver for reference purposes.")]
	public string customName;

	[Tooltip("The slot of the associated skill. Set to None to allow this behavior to run regardless of skill availability.")]
	public SkillSlot skillSlot;

	[Tooltip("The skill that the specified slot must have for this behavior to run. Set to none to allow any skill.")]
	[Header("Selection Conditions")]
	public SkillDef requiredSkill;

	[Tooltip("If set, this cannot be the dominant driver while the skill is on cooldown or out of stock.")]
	public bool requireSkillReady;

	[Tooltip("If set, this cannot be the dominant driver while the equipment is on cooldown or out of stock.")]
	public bool requireEquipmentReady;

	[Tooltip("The minimum health fraction required of the user for this behavior.")]
	public float minUserHealthFraction = float.NegativeInfinity;

	[Tooltip("The maximum health fraction required of the user for this behavior.")]
	public float maxUserHealthFraction = float.PositiveInfinity;

	[Tooltip("The minimum health fraction required of the target for this behavior.")]
	public float minTargetHealthFraction = float.NegativeInfinity;

	[Tooltip("The maximum health fraction required of the target for this behavior.")]
	public float maxTargetHealthFraction = float.PositiveInfinity;

	[Tooltip("The minimum distance from the target required for this behavior.")]
	public float minDistance;

	[Tooltip("The maximum distance from the target required for this behavior.")]
	public float maxDistance = float.PositiveInfinity;

	public bool selectionRequiresTargetLoS;

	public bool selectionRequiresOnGround;

	public bool selectionRequiresAimTarget;

	[Tooltip("The maximum number of times that this skill can be selected.  If the value is < 0, then there is no maximum.")]
	public int maxTimesSelected = -1;

	[FormerlySerializedAs("targetType")]
	[Tooltip("The type of object targeted for movement.")]
	[Header("Behavior")]
	public TargetType moveTargetType;

	[Tooltip("If set, this skill will not be activated unless there is LoS to the target.")]
	public bool activationRequiresTargetLoS;

	[Tooltip("If set, this skill will not be activated unless there is LoS to the aim target.")]
	public bool activationRequiresAimTargetLoS;

	[Tooltip("If set, this skill will not be activated unless the aim vector is pointing close to the target.")]
	public bool activationRequiresAimConfirmation;

	[Tooltip("The movement type to use while this is the dominant skill driver.")]
	public MovementType movementType = MovementType.ChaseMoveTarget;

	public float moveInputScale = 1f;

	[Tooltip("Where to look while this is the dominant skill driver")]
	public AimType aimType = AimType.AtMoveTarget;

	[Tooltip("If set, the nodegraph will not be used to direct the local navigator while this is the dominant skill driver. Direction toward the target will be used instead.")]
	public bool ignoreNodeGraph;

	[Tooltip("If true, the AI will attempt to sprint while this is the dominant skill driver.")]
	public bool shouldSprint;

	public bool shouldFireEquipment;

	[ShowFieldObsolete]
	[Obsolete("Use buttonPressType instead.")]
	public bool shouldTapButton;

	public ButtonPressType buttonPressType;

	[Header("Transition Behavior")]
	[Tooltip("If non-negative, this value will be used for the driver evaluation timer while this is the dominant skill driver.")]
	public float driverUpdateTimerOverride = -1f;

	[Tooltip("If set and this is the dominant skill driver, the current enemy will be reset at the time of the next evaluation.")]
	public bool resetCurrentEnemyOnNextDriverSelection;

	[Tooltip("If true, this skill driver cannot be chosen twice in a row.")]
	public bool noRepeat;

	[Tooltip("The AI skill driver that will be treated as having top priority after this one.")]
	public AISkillDriver nextHighPriorityOverride;

	public float minDistanceSqr => minDistance * minDistance;

	public float maxDistanceSqr => maxDistance * maxDistance;

	public int timesSelected { get; private set; }

	private void OnValidate()
	{
		if (shouldTapButton)
		{
			buttonPressType = ButtonPressType.TapContinuous;
		}
	}

	private void OnEnable()
	{
	}

	public void OnSelected()
	{
		int num = timesSelected + 1;
		timesSelected = num;
	}
}
