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
    }
}
