using System;
using UnityEngine;

namespace NaughtyAttributes.Test
{
	public class HideIfTest : MonoBehaviour
	{
		public bool hide1;
		public bool hide2;
		public HideIfEnum enum1;
		[EnumFlags] public HideIfEnumFlag enum2;

		[HideIf(EConditionOperator.And, "hide1", "hide2")]
		[ReorderableList]
		public int[] hideIfAll;

		[HideIf(EConditionOperator.Or, "hide1", "hide2")]
		[ReorderableList]
		public int[] hideIfAny;

		[HideIf("enum1", HideIfEnum.Case0)]
		[ReorderableList]
		public int[] hideIfEnum;

		[HideIf("enum2", HideIfEnumFlag.Flag0)]
		[ReorderableList]
		public int[] hideIfEnumFlag;

		[HideIf("enum2", HideIfEnumFlag.Flag0 | HideIfEnumFlag.Flag1)]
		[ReorderableList]
		public int[] hideIfEnumFlagMulti;

		public HideIfNest1 nest1;
	}

	[System.Serializable]
	public class HideIfNest1
	{
		public bool hide1;
		public bool hide2;
		public HideIfEnum enum1;
		[EnumFlags] public HideIfEnumFlag enum2;
		public bool Hide1 { get { return hide1; } }
		public bool Hide2 { get { return hide2; } }
		public HideIfEnum Enum1 { get { return enum1; } }
		public HideIfEnumFlag Enum2 { get { return enum2; } }

		[HideIf(EConditionOperator.And, "Hide1", "Hide2")]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int hideIfAll;

		[HideIf(EConditionOperator.Or, "Hide1", "Hide2")]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int hideIfAny;

		[HideIf("Enum1", HideIfEnum.Case1)]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int hideIfEnum;

		[HideIf("Enum2", HideIfEnumFlag.Flag0)]
		[AllowNesting]
		public int hideIfEnumFlag;

		[HideIf("Enum2", HideIfEnumFlag.Flag0 | HideIfEnumFlag.Flag1)]
		[AllowNesting]
		public int hideIfEnumFlagMulti;

		public HideIfNest2 nest2;
	}

	[System.Serializable]
	public class HideIfNest2
	{
		public bool hide1;
		public bool hide2;
		public HideIfEnum enum1;
		[EnumFlags] public HideIfEnumFlag enum2;
		public bool GetHide1() { return hide1; }
		public bool GetHide2() { return hide2; }
		public HideIfEnum GetEnum1() { return enum1; }
		public HideIfEnumFlag GetEnum2() { return enum2; }

		[HideIf(EConditionOperator.And, "GetHide1", "GetHide2")]
		[MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer
		public Vector2 hideIfAll = new Vector2(0.25f, 0.75f);

		[HideIf(EConditionOperator.Or, "GetHide1", "GetHide2")]
		[MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer
		public Vector2 hideIfAny = new Vector2(0.25f, 0.75f);

		[HideIf("GetEnum1", HideIfEnum.Case2)]
		[MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer
		public Vector2 hideIfEnum = new Vector2(0.25f, 0.75f);

		[HideIf("GetEnum2", HideIfEnumFlag.Flag0)]
		[MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer
		public Vector2 hideIfEnumFlag;

		[HideIf("GetEnum2", HideIfEnumFlag.Flag0 | HideIfEnumFlag.Flag1)]
		[MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer
		public Vector2 hideIfEnumFlagMulti;
	}

	public enum HideIfEnum
	{
		Case0,
		Case1,
		Case2
	}

	[Flags]
	public enum HideIfEnumFlag
	{
		Flag0 = 1,
		Flag1 = 2,
		Flag2 = 4,
		Flag3 = 8
	}
}
