﻿using UnityEngine;
using UnityEditor;
using System;

namespace RememorySDK
{
    public enum AlignType
    {
        Center,
        Left,
        Right,
        Top,
        Bottom
    }
    public static class LayoutUtil
    {
        public static readonly int DEF_SPACE_SIZE = 20;

        public static GUILayoutOption windowWidth = GUILayout.Width(512);
        public static GUILayoutOption TextFieldLayout = GUILayout.Width(400);
        public static GUILayoutOption ButtonLayout = GUILayout.Width(300);

        public static GUILayoutOption MiniWindowButtonLayout = GUILayout.Width(50);
        public static GUILayoutOption MiniButtonLayout = GUILayout.Width(200);

        public static GUIStyleState redText = new GUIStyleState
        {
            textColor = Color.red
        };

        public static GUIStyleState blueText = new GUIStyleState
        {
            textColor = Color.white
        };

        public static GUIStyleState normalFontColor = new GUIStyleState
        {
            textColor = Color.white
        };

        public static GUIStyle blueStyle = new GUIStyle
        {
            normal = LayoutUtil.blueText
        };

        public static GUIStyle errorStyle = new GUIStyle
        {
            normal = LayoutUtil.redText
        };

        public static GUIStyle centerStyle = new GUIStyle
        {
            alignment = TextAnchor.MiddleCenter
        };


        public static GUIStyle fontSizeH1 = new GUIStyle
        {
            fontSize = 20,
            normal = normalFontColor
        };

        public static GUIStyle fontSizeH3 = new GUIStyle
        {
            fontSize = 16,
            normal = normalFontColor
        };

        public static GUIStyle fontSizeH4 = new GUIStyle
        {
            fontSize = 13,
            normal = normalFontColor
        };

        public static GUILayoutOption[] selectContentsTextLayout = new GUILayoutOption[]
        {
            GUILayout.Width(300),
            GUILayout.Height(30)
        };
        public static GUILayoutOption[] selectContentsDescriptionLayout = new GUILayoutOption[]
        {
            GUILayout.Width(300),
            GUILayout.Height(30)
        };

        public static GUIStyle titleGuiStyle = new GUIStyle
        {
            fontSize = 15,
            fontStyle = FontStyle.BoldAndItalic,
            alignment = TextAnchor.MiddleCenter,
            wordWrap = true,
            normal = LayoutUtil.redText
        };

        public static void SetSpace(int spaceSize)
        {
            GUILayout.Space(spaceSize);
        }

        public static void Space()
        {
            GUILayout.Space(DEF_SPACE_SIZE);
        }

        public static void MiniSpace()
        {
            GUILayout.Space(5);
        }

        public static void Centered(Action callback)
        {
            EditorGUILayout.BeginHorizontal();
            {
                GUILayout.FlexibleSpace();
                callback();
                GUILayout.FlexibleSpace();
            }
            EditorGUILayout.EndHorizontal();
        }

        public static void WindowLayout(string title, Action callback)
        {
            Space();
            int height = 150;
            int width = 500;
            Centered(() =>
            {
                GUILayout.BeginVertical(title, "window", GUILayout.Height(height), GUILayout.Width(width));
                Space();
                callback();
                GUILayout.EndVertical();
            });
        }

        public static void CellWindowLayout(string title, Action callback)
        {
            int height = 100;
            int width = 330;
            Centered(() =>
            {
                GUILayout.BeginVertical(title, "window", GUILayout.Height(height), GUILayout.Width(width));
                callback();
                GUILayout.EndVertical();
            });

        }
        public static void FlexibleHalfWindowLayout(string title, float width, Action callback)
        {
            int height = 550;

            Centered(() =>
            {
                GUILayout.BeginVertical(title, "window", GUILayout.Height(height), GUILayout.Width(width));
                callback();
                GUILayout.EndVertical();
            });
        }

        public static void HalfWindowLayout(string title, Action callback)
        {
            // Space();
            int height = 550;
            int width = 350;
            Centered(() =>
            {
                GUILayout.BeginVertical(title, "window", GUILayout.Height(height), GUILayout.Width(width));
                callback();
                GUILayout.EndVertical();
            });
        }

        public static void MiniWindowLayout(Action callback)
        {
            Space();
            int height = 150;
            int width = 500;
            Centered(() =>
            {
                GUILayout.BeginVertical("window", GUILayout.Height(height), GUILayout.Width(width));
                callback();
                GUILayout.EndVertical();
            });
        }

        public static void HorizontalLayout(AlignType align, Action callback)
        {
            GUILayout.BeginHorizontal();
            {
                if (align == AlignType.Center || align == AlignType.Right)
                {
                    GUILayout.FlexibleSpace();
                }
                if (callback != null)
                {
                    callback();
                }
                if (align == AlignType.Center || align == AlignType.Left)
                {
                    GUILayout.FlexibleSpace();
                }
            }

            GUILayout.EndHorizontal();
        }

        public static void VerticalLayout(AlignType align, Action callback)
        {
            GUILayout.BeginVertical();
            {
                if (align == AlignType.Center || align == AlignType.Bottom)
                {
                    GUILayout.FlexibleSpace();
                }
                if (callback != null)
                {
                    callback();
                }
                if (align == AlignType.Center || align == AlignType.Top)
                {
                    GUILayout.FlexibleSpace();
                }
            }

            GUILayout.EndVertical();
        }

        public static Vector2 ScrollArea(Vector2 scrollPos, Action callback)
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            GUILayout.BeginVertical();
            callback();
            GUILayout.EndVertical();
            EditorGUILayout.EndScrollView();
            return scrollPos;
        }
    }
}