using System;
using UnityEngine;

namespace NaughtyAttributes.Test
{
    public class ShowIfTest : MonoBehaviour
    {
        public bool show1;
        public bool show2;
        public ShowIfEnum enum1;
        [EnumFlags] public ShowIfEnumFlag enum2;

        [ShowIf(EConditionOperator.And, "show1", "show2")]
        [ReorderableList]
        public int[] showIfAll;

        [ShowIf(EConditionOperator.Or, "show1", "show2")]
        [ReorderableList]
        public int[] showIfAny;

        [ShowIf("enum1", ShowIfEnum.Case0)]
        [ReorderableList]
        public int[] showIfEnum;

        [ShowIf("enum2", ShowIfEnumFlag.Flag0)]
        [ReorderableList]
        public int[] showIfEnumFlag;

        [ShowIf("enum2", ShowIfEnumFlag.Flag0 | ShowIfEnumFlag.Flag1)]
        [ReorderableList]
        public int[] showIfEnumFlagMulti;

        public ShowIfNest1 nest1;
    }

    [System.Serializable]
    public class ShowIfNest1
    {
        public bool show1;
        public bool show2;
        public ShowIfEnum enum1;
        [EnumFlags] public ShowIfEnumFlag enum2;
        public bool Show1 { get { return show1; } }
        public bool Show2 { get { return show2; } }
        public ShowIfEnum Enum1 { get { return enum1; } }
        public ShowIfEnumFlag Enum2 { get { return enum2; } }

        [ShowIf(EConditionOperator.And, "Show1", "Show2")]
        [AllowNesting] // Because it's nested we need to explicitly allow nesting
        public int showIfAll;

        [ShowIf(EConditionOperator.Or, "Show1", "Show2")]
        [AllowNesting] // Because it's nested we need to explicitly allow nesting
        public int showIfAny;

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

        [ShowIf("Enum2", ShowIfEnumFlag.Flag0)]
        [AllowNesting]
        public int showIfEnumFlag;

        [ShowIf("Enum2", ShowIfEnumFlag.Flag0 | ShowIfEnumFlag.Flag1)]
        [AllowNesting]
        public int showIfEnumFlagMulti;

        public ShowIfNest2 nest2;
    }

    [System.Serializable]
    public class ShowIfNest2
    {
        public bool show1;
        public bool show2;
        public ShowIfEnum enum1;
        [EnumFlags] public ShowIfEnumFlag enum2;
        public bool GetShow1() { return show1; }
        public bool GetShow2() { return show2; }
        public ShowIfEnum GetEnum1() { return enum1; }
        public ShowIfEnumFlag GetEnum2() { return enum2; }

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

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

        [ShowIf("GetEnum1", ShowIfEnum.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 showIfEnum = new Vector2(0.25f, 0.75f);

        [ShowIf("GetEnum2", ShowIfEnumFlag.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 showIfEnumFlag;

        [ShowIf("GetEnum2", ShowIfEnumFlag.Flag0 | ShowIfEnumFlag.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 showIfEnumFlagMulti;
    }

    public enum ShowIfEnum
    {
        Case0,
        Case1,
        Case2
    }

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