using System;
using System.Reflection;

using UnityEngine;

namespace Unity.PlasticSCM.Editor.UI
{
    internal static class PlasticSplitterGUILayout
    {
        internal static void BeginHorizontalSplit(object splitterState)
        {
            InternalBeginHorizontalSplit.Invoke(
                null, new object[] {splitterState, new GUILayoutOption[] { }});
        }

        internal static void EndHorizontalSplit()
        {
            InternalEndHorizontalSplit.Invoke(
                null, new object[] { });
        }

        internal static void BeginVerticalSplit(object splitterState)
        {
            InternalBeginVerticalSplit.Invoke(
                null, new object[] {splitterState, new GUILayoutOption[] { }});
        }

        internal static void EndVerticalSplit()
        {
            InternalEndVerticalSplit.Invoke(
                null, new object[] { });
        }

        internal static object InitSplitterState(
            float[] relativeSizes, int[] minSizes, int[] maxSizes)
        {
            ConstructorInfo ctorInfo = SplitterState.GetConstructor(
                new Type[] {typeof(float[]), typeof(int[]), typeof(int[])});

            return ctorInfo.Invoke(
                new object[] {relativeSizes, minSizes, maxSizes});
        }

        static readonly Type SplitterState =
            typeof(UnityEditor.Editor).Assembly.
                GetType("UnityEditor.SplitterState");
        static readonly Type InternalSplitterGUILayout =
            typeof(UnityEditor.Editor).Assembly.
                GetType("UnityEditor.SplitterGUILayout");

        static readonly MethodInfo InternalBeginHorizontalSplit =
            InternalSplitterGUILayout.GetMethod(
                "BeginHorizontalSplit",
                new Type[] { SplitterState, typeof(GUILayoutOption[]) });
        static readonly MethodInfo InternalEndHorizontalSplit =
            InternalSplitterGUILayout.GetMethod("EndHorizontalSplit");

        static readonly MethodInfo InternalBeginVerticalSplit =
            InternalSplitterGUILayout.GetMethod(
                "BeginVerticalSplit",
                new Type[] { SplitterState, typeof(GUILayoutOption[]) });
        static readonly MethodInfo InternalEndVerticalSplit =
            InternalSplitterGUILayout.GetMethod("EndVerticalSplit");
    }
}