using System;
using UnityEngine;

namespace NaughtyAttributes.Test
{
    public class EnableIfTest : MonoBehaviour
    {
        public bool enable1;
        public bool enable2;
        public EnableIfEnum enum1;
        [EnumFlags] public EnableIfEnumFlag enum2;

        [EnableIf(EConditionOperator.And, "enable1", "enable2")]
        [ReorderableList]
        public int[] enableIfAll;

        [EnableIf(EConditionOperator.Or, "enable1", "enable2")]
        [ReorderableList]
        public int[] enableIfAny;

        [EnableIf("enum1", EnableIfEnum.Case0)]
        [ReorderableList]
        public int[] enableIfEnum;

        [EnableIf("enum2", EnableIfEnumFlag.Flag0)]
        [ReorderableList]
        public int[] enableIfEnumFlag;

        [EnableIf("enum2", EnableIfEnumFlag.Flag0 | EnableIfEnumFlag.Flag1)]
        [ReorderableList]
        public int[] enableIfEnumFlagMulti;

        public EnableIfNest1 nest1;
    }

    [System.Serializable]
    public class EnableIfNest1
    {
        public bool enable1;
        public bool enable2;
        public EnableIfEnum enum1;
        [EnumFlags] public EnableIfEnumFlag enum2;
        public bool Enable1 { get { return enable1; } }
        public bool Enable2 { get { return enable2; } }
        public EnableIfEnum Enum1 { get { return enum1; } }
        public EnableIfEnumFlag Enum2 { get { return enum2; } }

        [EnableIf(EConditionOperator.And, "Enable1", "Enable2")]
        [AllowNesting] // Because it's nested we need to explicitly allow nesting
        public int enableIfAll;

        [EnableIf(EConditionOperator.Or, "Enable1", "Enable2")]
        [AllowNesting] // Because it's nested we need to explicitly allow nesting
        public int enableIfAny;

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

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

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

        public EnableIfNest2 nest2;
    }

    [System.Serializable]
    public class EnableIfNest2
    {
        public bool enable1;
        public bool enable2;
        public EnableIfEnum enum1;
        [EnumFlags] public EnableIfEnumFlag enum2;
        public bool GetEnable1() { return enable1; }
        public bool GetEnable2() { return enable2; }
        public EnableIfEnum GetEnum1() { return enum1; }
        public EnableIfEnumFlag GetEnum2() { return enum2; }

        [EnableIf(EConditionOperator.And, "GetEnable1", "GetEnable2")]
        [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);

        [EnableIf(EConditionOperator.Or, "GetEnable1", "GetEnable2")]
        [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);

        [EnableIf("GetEnum1", EnableIfEnum.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);

        [EnableIf("GetEnum2", EnableIfEnumFlag.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 enableIfEnumFlag;

        [EnableIf("GetEnum2", EnableIfEnumFlag.Flag0 | EnableIfEnumFlag.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 enableIfEnumFlagMulti;
    }

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

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