﻿
using UnityEngine;
using GamingIsLove.Footsteps;
using System.Collections.Generic;

namespace ORKFramework.Events.Steps
{
	[ORKEditorHelp("FS Change Mode", "Changes the mode of a 'Footstepper' component.", "")]
	[ORKEventStep(typeof(BaseEvent))]
	[ORKNodeInfo("Movement/Footstepper")]
	public class FSChangeModeStep : BaseEventStep
	{
		[ORKEditorHelp("Mode", "Select in which mode will be used:\n" +
			"- Enabled: Uses both audio clips and prefabs from footstep sources.\n" +
			"- Disabled: Isn't used at all.\n" +
			"- Only Audio: Only uses audio clips from footstep sources.\n" +
			"- Only Prefab: Only uses prefabs from footstep sources.\n", "")]
		public FootstepperMode mode = FootstepperMode.Enabled;

		[ORKEditorHelp("Change Non-Player", "Change the non-player mode of an 'ORK Player Footstepper.", "")]
		public bool changeNonPlayerMode = false;

		[ORKEditorInfo(separator=true, labelText="Game Object")]
		public EventObjectSetting usedObject = new EventObjectSetting();

		public FSChangeModeStep()
		{

		}

		public override void Execute(BaseEvent baseEvent)
		{
			if(this.changeNonPlayerMode)
			{
				List<ORKPlayerFootstepper> list = ComponentHelper.GetAllInChildren<ORKPlayerFootstepper>(this.usedObject.GetObject(baseEvent));
				for(int i = 0; i < list.Count; i++)
				{
					if(list[i] != null)
					{
						list[i].nonPlayerMode = this.mode;
					}
				}
			}
			else
			{
				List<Footstepper> list = ComponentHelper.GetAllInChildren<Footstepper>(this.usedObject.GetObject(baseEvent));
				for(int i = 0; i < list.Count; i++)
				{
					if(list[i] != null)
					{
						list[i].mode = this.mode;
					}
				}
			}
			baseEvent.StepFinished(this.next);
		}


		/*
		============================================================================
		Node name functions
		============================================================================
		*/
		public override string GetNodeDetails()
		{
			return this.usedObject.GetInfoText() + ": " + this.mode +
				(this.changeNonPlayerMode ? " (Non-Player)" : "");
		}
	}

	[ORKEditorHelp("FS Change Effect Tag", "Changes the effect tag of a 'Footstepper' component.", "")]
	[ORKEventStep(typeof(BaseEvent))]
	[ORKNodeInfo("Movement/Footstepper")]
	public class FSChangeEffectTagStep : BaseEventStep
	{
		[ORKEditorInfo(labelText="Effect Tag")]
		public EventString effectTag = new EventString();

		[ORKEditorInfo(separator=true, labelText="Game Object")]
		public EventObjectSetting usedObject = new EventObjectSetting();

		public FSChangeEffectTagStep()
		{

		}

		public override void Execute(BaseEvent baseEvent)
		{
			string tag = this.effectTag.GetValue(baseEvent);
			List<Footstepper> list = ComponentHelper.GetAllInChildren<Footstepper>(this.usedObject.GetObject(baseEvent));
			for(int i = 0; i < list.Count; i++)
			{
				if(list[i] != null)
				{
					list[i].effectTag = tag;
				}
			}
			baseEvent.StepFinished(this.next);
		}


		/*
		============================================================================
		Node name functions
		============================================================================
		*/
		public override string GetNodeDetails()
		{
			return this.usedObject.GetInfoText() + ": " + this.effectTag.GetInfoText();
		}
	}

	[ORKEditorHelp("FS Play Footstep", "Tries playing a footstep on a 'Footstepper' component.", "")]
	[ORKEventStep(typeof(BaseEvent))]
	[ORKNodeInfo("Movement/Footstepper")]
	public class FSPlayFootstepStep : BaseEventStep
	{
		[ORKEditorHelp("Foot Index", "The index of the foot that will be used.", "")]
		public int index = 0;

		[ORKEditorHelp("Volume (0-1)", "The volume used to play the footstep.", "")]
		[ORKEditorLimit(0.0f, 1.0f)]
		public float volume = 1;

		[ORKEditorHelp("Footstep Type", "Select the type of footstep that will be played.", "")]
		public FootstepType type = FootstepType.Walk;

		[ORKEditorInfo(separator=true, labelText="Custom Name")]
		[ORKEditorLayout("type", FootstepType.Custom, endCheckGroup=true)]
		public EventString customName = new EventString();

		[ORKEditorInfo(separator=true, labelText="Game Object")]
		public EventObjectSetting usedObject = new EventObjectSetting();

		public FSPlayFootstepStep()
		{

		}

		public override void Execute(BaseEvent baseEvent)
		{
			List<Footstepper> list = ComponentHelper.GetAllInChildren<Footstepper>(this.usedObject.GetObject(baseEvent));
			for(int i = 0; i < list.Count; i++)
			{
				if(list[i] != null)
				{
					list[i].PlayFootstep(list[i].GetFoot(this.index), this.volume, this.type, this.customName.GetValue(baseEvent));
				}
			}
			baseEvent.StepFinished(this.next);
		}


		/*
		============================================================================
		Node name functions
		============================================================================
		*/
		public override string GetNodeDetails()
		{
			return this.usedObject.GetInfoText() + ": " + this.type;
		}
	}
}
