using UnityEngine;
#if UNITY_5_3_OR_NEWER
using UnityEditor.SceneManagement;
#endif
using UnityEditor;

namespace FairyGUIEditor
{
    /// <summary>
    /// 
    /// </summary>
    [CustomEditor(typeof(FairyGUI.UIPanel))]
    public class UIPanelEditor : Editor
    {
        SerializedProperty packageName;
        SerializedProperty componentName;
        SerializedProperty packagePath;
        SerializedProperty renderMode;
        SerializedProperty renderCamera;
        SerializedProperty sortingOrder;
        SerializedProperty position;
        SerializedProperty scale;
        SerializedProperty rotation;
        SerializedProperty fairyBatching;
        SerializedProperty fitScreen;
        SerializedProperty touchDisabled;
        SerializedProperty hitTestMode;
        SerializedProperty setNativeChildrenOrder;

        string[] propertyToExclude;

        void OnEnable()
        {
            packageName = serializedObject.FindProperty("packageName");
            componentName = serializedObject.FindProperty("componentName");
            packagePath = serializedObject.FindProperty("packagePath");
            renderMode = serializedObject.FindProperty("renderMode");
            renderCamera = serializedObject.FindProperty("renderCamera");
            sortingOrder = serializedObject.FindProperty("sortingOrder");
            position = serializedObject.FindProperty("position");
            scale = serializedObject.FindProperty("scale");
            rotation = serializedObject.FindProperty("rotation");
            fairyBatching = serializedObject.FindProperty("fairyBatching");
            fitScreen = serializedObject.FindProperty("fitScreen");
            touchDisabled = serializedObject.FindProperty("touchDisabled");
            hitTestMode = serializedObject.FindProperty("hitTestMode");
            setNativeChildrenOrder = serializedObject.FindProperty("setNativeChildrenOrder");


            propertyToExclude = new string[] { "m_Script", "packageName", "componentName", "packagePath", "renderMode",
                "renderCamera", "sortingOrder", "position", "scale", "rotation", "fairyBatching", "fitScreen","touchDisabled",
                "hitTestMode","cachedUISize","setNativeChildrenOrder"
            };
        }

        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            FairyGUI.UIPanel panel = target as FairyGUI.UIPanel;

            DrawPropertiesExcluding(serializedObject, propertyToExclude);

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Package Name");
            if (GUILayout.Button(packageName.stringValue, "ObjectField"))
                EditorWindow.GetWindow<PackagesWindow>(true, "Select a UI Component").SetSelection(packageName.stringValue, componentName.stringValue);

            if (GUILayout.Button("Clear", GUILayout.Width(50)))
            {
#if UNITY_2018_3_OR_NEWER
                bool isPrefab = PrefabUtility.GetPrefabAssetType(panel) != PrefabAssetType.NotAPrefab;
#else
                bool isPrefab = PrefabUtility.GetPrefabType(panel) == PrefabType.Prefab;
#endif
                panel.SendMessage("OnUpdateSource", new object[] { null, null, null, !isPrefab });

#if UNITY_5_3_OR_NEWER
                EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
#elif UNITY_5
                EditorApplication.MarkSceneDirty();
#else
                EditorUtility.SetDirty(panel);
#endif
            }
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Component Name");
            if (GUILayout.Button(componentName.stringValue, "ObjectField"))
                EditorWindow.GetWindow<PackagesWindow>(true, "Select a UI Component").SetSelection(packageName.stringValue, componentName.stringValue);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Package Path");
            EditorGUILayout.LabelField(packagePath.stringValue, (GUIStyle)"helpbox");
            EditorGUILayout.EndHorizontal();

            if (Application.isPlaying)
                EditorGUILayout.EnumPopup("Render Mode", panel.container.renderMode);
            else
                EditorGUILayout.PropertyField(renderMode);
            if ((RenderMode)renderMode.enumValueIndex != RenderMode.ScreenSpaceOverlay)
                EditorGUILayout.PropertyField(renderCamera);

            int oldSortingOrder = panel.sortingOrder;
            EditorGUILayout.PropertyField(sortingOrder);
            EditorGUILayout.PropertyField(fairyBatching);
            EditorGUILayout.PropertyField(hitTestMode);
            EditorGUILayout.PropertyField(touchDisabled);
            EditorGUILayout.PropertyField(setNativeChildrenOrder);
            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("UI Transform", (GUIStyle)"OL Title");
            EditorGUILayout.Separator();
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(position);
            EditorGUILayout.PropertyField(rotation);
            EditorGUILayout.PropertyField(scale);
            EditorGUILayout.Space();

            FairyGUI.FitScreen oldFitScreen = (FairyGUI.FitScreen)fitScreen.enumValueIndex;
            EditorGUILayout.PropertyField(fitScreen);

            if (serializedObject.ApplyModifiedProperties())
            {
#if UNITY_2018_3_OR_NEWER
                bool isPrefab = PrefabUtility.GetPrefabAssetType(panel) != PrefabAssetType.NotAPrefab;
#else
                bool isPrefab = PrefabUtility.GetPrefabType(panel) == PrefabType.Prefab;
#endif
                if (!isPrefab)
                {
                    panel.ApplyModifiedProperties(sortingOrder.intValue != oldSortingOrder, (FairyGUI.FitScreen)fitScreen.enumValueIndex != oldFitScreen);
                }
            }
        }

        void OnSceneGUI()
        {
            FairyGUI.UIPanel panel = (target as FairyGUI.UIPanel);
            if (panel.container == null)
                return;

            Vector3 pos = panel.GetUIWorldPosition();
            float sizeFactor = HandleUtility.GetHandleSize(pos);
#if UNITY_2017_1_OR_NEWER
            var fmh_147_58_638568338179562260 = Quaternion.identity; Vector3 newPos = Handles.FreeMoveHandle(pos, sizeFactor, Vector3.one, Handles.ArrowHandleCap);
#else
            Vector3 newPos = Handles.FreeMoveHandle(pos, Quaternion.identity, sizeFactor, Vector3.one, Handles.ArrowCap);
#endif
            if (newPos != pos)
            {
                Vector2 v1 = HandleUtility.WorldToGUIPoint(pos);
                Vector2 v2 = HandleUtility.WorldToGUIPoint(newPos);
                Vector3 delta = v2 - v1;
                delta.x = (int)delta.x;
                delta.y = (int)delta.y;

                panel.MoveUI(delta);
            }
        }
    }
}
