using RotaryHeart.Lib.SerializableDictionary;
using UnityEngine;

namespace RotaryHeart.Lib
{
    [CreateAssetMenu(fileName = "DataBase.asset", menuName = "Data Base")]
    public class DataBaseExample : ScriptableObject
    {
        public enum EnumExample
        {
            None,
            Value1,
            Value2,
            Value3,
            Value4,
            Value5,
            Value6
        }

        [System.Serializable]
        public class ChildTest
        {
            public Color myChildColor;
            public bool myChildBool;
            public Gradient test;
        }

        [System.Serializable]
        public class ClassTest
        {
            public string id;
            public float test;
            public string test2;
            public Quaternion quat;
            public ChildTest[] childTest;
        }

        [System.Serializable]
        public class ArrayTest
        {
            public int[] myArray;
        }

        [System.Serializable]
        public class AdvancedGenericClass
        {
            [Range(0, 100)]
            public float value;

            public bool Equals(AdvancedGenericClass other)
            {
                if (ReferenceEquals(null, other)) return false;
                if (ReferenceEquals(this, other)) return true;
                return other.value == value;
            }

            public override bool Equals(object obj)
            {
                if (ReferenceEquals(null, obj)) return false;
                if (ReferenceEquals(this, obj)) return true;
                if (obj.GetType() != typeof(AdvancedGenericClass)) return false;
                return Equals((AdvancedGenericClass)obj);
            }

            public override int GetHashCode()
            {
                unchecked
                {
                    return value.GetHashCode();
                }
            }
        }

        [SerializeField]
        public Generic_String _genericString;

        [SerializeField]
        public Generic_Generic _genericGeneric;

        [SerializeField, ID("id")]
        private S_GenericDictionary _stringGeneric;

        [SerializeField]
        private I_GenericDictionary _intGeneric;

        [SerializeField]
        private I_GO _intGameobject;
        [SerializeField]
        private GO_I _gameobjectInt;

        [SerializeField]
        private S_GO _stringGameobject;
        [SerializeField]
        private GO_S _gameobjectString;

        [SerializeField]
        private S_Mat _stringMaterial;
        [SerializeField]
        private Mat_S _materialString;

        [SerializeField]
        private V3_Q _vector3Quaternion;
        [SerializeField]
        private Q_V3 _quaternionVector3;

        [SerializeField]
        private S_AC _stringAudioClip;
        [SerializeField]
        private AC_S _audioClipString;

        [SerializeField]
        private C_Int _charInt;
        [SerializeField]
        private G_Int _gradientInt;

        [SerializeField]
        private Int_IntArray _intArray;

        [SerializeField]
        private Enum_String _enumString;

        [SerializeField, DrawKeyAsProperty]
        private AdvanGeneric_String _advancedGenericKey;

        [System.Serializable]
        public class Generic_String : SerializableDictionaryBase<ClassTest, string> { }

        [System.Serializable]
        public class Generic_Generic : SerializableDictionaryBase<ClassTest, ClassTest> { }

        [System.Serializable]
        public class C_Int : SerializableDictionaryBase<char, int> { }
        [System.Serializable]
        public class G_Int : SerializableDictionaryBase<Gradient, int> { }

        [System.Serializable]
        public class I_GO : SerializableDictionaryBase<int, GameObject> { }
        [System.Serializable]
        public class GO_I : SerializableDictionaryBase<GameObject, int> { }

        [System.Serializable]
        public class S_GO : SerializableDictionaryBase<string, GameObject> { }
        [System.Serializable]
        public class GO_S : SerializableDictionaryBase<GameObject, string> { }

        [System.Serializable]
        public class S_Mat : SerializableDictionaryBase<string, Material> { }
        [System.Serializable]
        public class Mat_S : SerializableDictionaryBase<Material, string> { }

        [System.Serializable]
        public class S_AC : SerializableDictionaryBase<string, AudioClip> { }
        [System.Serializable]
        public class AC_S : SerializableDictionaryBase<AudioClip, string> { }

        [System.Serializable]
        public class S_Sprite : SerializableDictionaryBase<string, Sprite> { }

        [System.Serializable]
        public class V3_Q : SerializableDictionaryBase<Vector3, Quaternion> { }
        [System.Serializable]
        public class Q_V3 : SerializableDictionaryBase<Quaternion, Vector3> { }

        [System.Serializable]
        public class S_GenericDictionary : SerializableDictionaryBase<string, ClassTest> { }

        [System.Serializable]
        public class I_GenericDictionary : SerializableDictionaryBase<int, ClassTest> { }

        [System.Serializable]
        public class Int_IntArray : SerializableDictionaryBase<int, ArrayTest> { }

        [System.Serializable]
        public class Enum_String : SerializableDictionaryBase<EnumExample, string> { };

        [System.Serializable]
        public class AdvanGeneric_String : SerializableDictionaryBase<AdvancedGenericClass, string> { };
    }
}