using System;
using UnityEngine;

namespace NaughtyAttributes.Test
{
	public class DisableIfTest : MonoBehaviour
	{
		public bool disable1;
		public bool disable2;
		public DisableIfEnum enum1;
		[EnumFlags] public DisableIfEnumFlag enum2;

		[DisableIf(EConditionOperator.And, "disable1", "disable2")]
		[ReorderableList]
		public int[] disableIfAll;

		[DisableIf(EConditionOperator.Or, "disable1", "disable2")]
		[ReorderableList]
		public int[] disableIfAny;

		[DisableIf("enum1", DisableIfEnum.Case0)]
		[ReorderableList]
		public int[] disableIfEnum;

		[DisableIf("enum2", DisableIfEnumFlag.Flag0)]
		[ReorderableList]
		public int[] disableIfEnumFlag;

		[DisableIf("enum2", DisableIfEnumFlag.Flag0 | DisableIfEnumFlag.Flag1)]
		[ReorderableList]
		public int[] disableIfEnumFlagMulti;

		public DisableIfNest1 nest1;
	}

	[System.Serializable]
	public class DisableIfNest1
	{
		public bool disable1;
		public bool disable2;
		public DisableIfEnum enum1;
		[EnumFlags] public DisableIfEnumFlag enum2;
		public bool Disable1 { get { return disable1; } }
		public bool Disable2 { get { return disable2; } }
		public DisableIfEnum Enum1 { get { return enum1; } }
		public DisableIfEnumFlag Enum2 { get { return enum2; } }

		[DisableIf(EConditionOperator.And, "Disable1", "Disable2")]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int disableIfAll = 1;

		[DisableIf(EConditionOperator.Or, "Disable1", "Disable2")]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int disableIfAny = 2;

		[DisableIf("Enum1", DisableIfEnum.Case1)]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int disableIfEnum = 3;

		[DisableIf("Enum2", DisableIfEnumFlag.Flag0)]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int disableIfEnumFlag;

		[DisableIf("Enum2", DisableIfEnumFlag.Flag0 | DisableIfEnumFlag.Flag1)]
		[AllowNesting] // Because it's nested we need to explicitly allow nesting
		public int disableIfEnumFlagMulti;

		public DisableIfNest2 nest2;
	}

	[System.Serializable]
	public class DisableIfNest2
	{
		public bool disable1;
		public bool disable2;
		public DisableIfEnum enum1;
		[EnumFlags] public DisableIfEnumFlag enum2;
		public bool GetDisable1() { return disable1; }
		public bool GetDisable2() { return disable2; }
		public DisableIfEnum GetEnum1() { return enum1; }
		public DisableIfEnumFlag GetEnum2() { return enum2; }

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

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

		[DisableIf("GetEnum1", DisableIfEnum.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 enableIfEnum = new Vector2(0.25f, 0.75f);

		[DisableIf("GetEnum2", DisableIfEnumFlag.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 disableIfEnumFlag;

		[DisableIf("GetEnum2", DisableIfEnumFlag.Flag0 | DisableIfEnumFlag.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 disableIfEnumFlagMulti;
	}

	[System.Serializable]
	public enum DisableIfEnum
	{
		Case0,
		Case1,
		Case2
	}

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