using UnityEngine;
using UnityEditor;
using System.Collections;
using Rotorz.ReorderableList.Internal;

public class PhotonGUI
{
    #region Styles
    static GUIStyle m_DefaultTitleStyle;
    public static GUIStyle DefaultTitleStyle
    {
        get
        {
            if( m_DefaultTitleStyle == null )
            {
                m_DefaultTitleStyle = new GUIStyle();
                m_DefaultTitleStyle.border = new RectOffset( 2, 2, 2, 1 );
                m_DefaultTitleStyle.margin = new RectOffset( 5, 5, 5, 0 );
                m_DefaultTitleStyle.padding = new RectOffset( 5, 5, 0, 0 );
                m_DefaultTitleStyle.alignment = TextAnchor.MiddleLeft;
                m_DefaultTitleStyle.normal.background = ReorderableListResources.texTitleBackground;
                m_DefaultTitleStyle.normal.textColor = EditorGUIUtility.isProSkin
                    ? new Color( 0.8f, 0.8f, 0.8f )
                    : new Color( 0.2f, 0.2f, 0.2f );
            }

            return m_DefaultTitleStyle;
        }
    }

    static GUIStyle m_DefaultContainerStyle;
    public static GUIStyle DefaultContainerStyle
    {
        get
        {
            if( m_DefaultContainerStyle == null )
            {
                m_DefaultContainerStyle = new GUIStyle();
                m_DefaultContainerStyle.border = new RectOffset( 2, 2, 1, 2 );
                m_DefaultContainerStyle.margin = new RectOffset( 5, 5, 5, 5 );
                m_DefaultContainerStyle.padding = new RectOffset( 1, 1, 2, 2 );
                m_DefaultContainerStyle.normal.background = ReorderableListResources.texContainerBackground;
            }

            return m_DefaultContainerStyle;
        }
    }

    static GUIStyle m_DefaultAddButtonStyle;
    public static GUIStyle DefaultAddButtonStyle
    {
        get
        {
            if( m_DefaultAddButtonStyle == null )
            {
                m_DefaultAddButtonStyle = new GUIStyle();
                m_DefaultAddButtonStyle.fixedWidth = 30;
                m_DefaultAddButtonStyle.fixedHeight = 16;
                m_DefaultAddButtonStyle.normal.background = ReorderableListResources.texAddButton;
                m_DefaultAddButtonStyle.active.background = ReorderableListResources.texAddButtonActive;
            }

            return m_DefaultAddButtonStyle;
        }
    }

    static GUIStyle m_DefaultRemoveButtonStyle;
    public static GUIStyle DefaultRemoveButtonStyle
    {
        get
        {
            if( m_DefaultRemoveButtonStyle == null )
            {
                m_DefaultRemoveButtonStyle = new GUIStyle();
                m_DefaultRemoveButtonStyle.fixedWidth = 30;
                m_DefaultRemoveButtonStyle.fixedHeight = 20;
                m_DefaultRemoveButtonStyle.active.background = ReorderableListResources.CreatePixelTexture( "Dark Pixel (List GUI)", new Color32( 18, 18, 18, 255 ) );
                m_DefaultRemoveButtonStyle.imagePosition = ImagePosition.ImageOnly;
                m_DefaultRemoveButtonStyle.alignment = TextAnchor.MiddleCenter;
            }

            return m_DefaultRemoveButtonStyle;
        }
    }

    static GUIStyle m_DefaultContainerRowStyle;
    public static GUIStyle DefaultContainerRowStyle
    {
        get
        {
            if( m_DefaultContainerRowStyle == null )
            {
                m_DefaultContainerRowStyle = new GUIStyle();
                m_DefaultContainerRowStyle.border = new RectOffset( 2, 2, 2, 2 );

                m_DefaultContainerRowStyle.margin = new RectOffset( 5, 5, 5, 5 );
                m_DefaultContainerRowStyle.padding = new RectOffset( 1, 1, 2, 2 );
                m_DefaultContainerRowStyle.normal.background = ReorderableListResources.texContainerBackground;
            }

            return m_DefaultContainerRowStyle;
        }
    }

    static GUIStyle m_FoldoutBold;
    public static GUIStyle FoldoutBold
    {
        get
        {
            if( m_FoldoutBold == null )
            {
                m_FoldoutBold = new GUIStyle( EditorStyles.foldout );
                m_FoldoutBold.fontStyle = FontStyle.Bold;
            }

            return m_FoldoutBold;
        }
    }

    static GUIStyle m_RichLabel;
    public static GUIStyle RichLabel
    {
        get
        {
            if( m_RichLabel == null )
            {
                m_RichLabel = new GUIStyle( GUI.skin.label );
                m_RichLabel.richText = true;
                m_RichLabel.wordWrap = true;
            }

            return m_RichLabel;
        }
    }
    #endregion

    static Texture2D m_HelpIcon;
    public static Texture2D HelpIcon
    {
        get
        {
            if( m_HelpIcon == null )
            {
                m_HelpIcon = AssetDatabase.LoadAssetAtPath( "Assets/Photon Unity Networking/Editor/PhotonNetwork/help.png", typeof( Texture2D ) ) as Texture2D;
            }

            return m_HelpIcon;
        }
    }

    #region Interface
    public static void ContainerHeader( string headline )
    {
        DoContainerHeader( headline, 27, 0 );
    }

    public static bool ContainerHeaderToggle( string headline, bool toggle )
    {
        return DoContainerHeaderToggle( headline, toggle );
    }

    public static bool ContainerHeaderFoldout( string headline, bool foldout )
    {
        return DoContainerHeaderFoldout( headline, foldout );
    }

    public static Rect ContainerBody( float height )
    {
        return DoContainerBody( height );
    }

    public static bool AddButton()
    {
        Rect controlRect = EditorGUILayout.GetControlRect( false, DefaultAddButtonStyle.fixedHeight - 5 );
        controlRect.yMin -= 5;
        controlRect.yMax -= 5;

        Rect addButtonRect = new Rect( controlRect.xMax - DefaultAddButtonStyle.fixedWidth,
                                       controlRect.yMin,
                                       DefaultAddButtonStyle.fixedWidth,
                                       DefaultAddButtonStyle.fixedHeight );

        return GUI.Button( addButtonRect, "", DefaultAddButtonStyle );
    }

    public static void DrawSplitter( Rect position )
    {
        ReorderableListResources.DrawTexture( position, ReorderableListResources.texItemSplitter );
    }

    public static void DrawGizmoOptions(
        Rect position,
        string label,
        SerializedProperty gizmoEnabledProperty,
        SerializedProperty gizmoColorProperty,
        SerializedProperty gizmoTypeProperty,
        SerializedProperty gizmoSizeProperty )
    {
        float height = EditorGUIUtility.singleLineHeight;
        float flexibleWidth = Mathf.Max( 40, position.width - EditorGUIUtility.labelWidth - 20 - 75 - 5 - 40 - 5 );

        Rect labelRect = new Rect( position.xMin, position.yMin, EditorGUIUtility.labelWidth, height );
        GUI.Label( labelRect, label );

        Rect enabledRect = new Rect( labelRect.xMax, labelRect.yMin, 20, height );
        EditorGUI.PropertyField( enabledRect, gizmoEnabledProperty, GUIContent.none );

        bool oldGUIEnabled = GUI.enabled;
        GUI.enabled = gizmoEnabledProperty.boolValue;

        Rect colorRect = new Rect( enabledRect.xMax + 5, labelRect.yMin, 70, height );
        EditorGUI.PropertyField( colorRect, gizmoColorProperty, GUIContent.none );

        Rect typeRect = new Rect( colorRect.xMax + 5, labelRect.yMin, flexibleWidth * 0.7f, height );
        EditorGUI.PropertyField( typeRect, gizmoTypeProperty, GUIContent.none );

        Rect sizeLabelRect = new Rect( typeRect.xMax + 10, labelRect.yMin, 30, height );
        GUI.Label( sizeLabelRect, "Size" );

        Rect sizeRect = new Rect( sizeLabelRect.xMax + 5, labelRect.yMin, flexibleWidth * 0.3f, height );
        EditorGUI.PropertyField( sizeRect, gizmoSizeProperty, GUIContent.none );

        GUI.enabled = oldGUIEnabled;
    }

    #endregion

    #region Implementation
    static Rect DoContainerBody( float height )
    {
        Rect controlRect = EditorGUILayout.GetControlRect( false, height );
        controlRect.yMin -= 3;
        controlRect.yMax -= 2;

        int controlID = GUIUtility.GetControlID( FocusType.Passive, controlRect );

        if( Event.current.type == EventType.Repaint )
        {
            PhotonGUI.DefaultContainerStyle.Draw( controlRect, GUIContent.none, controlID );
        }

        return controlRect;
    }

    static bool DoContainerHeaderToggle( string headline, bool toggle )
    {
        Rect rect = DoContainerHeader( headline, 27, 15 );
        Rect toggleRect = new Rect( rect.xMin + 5, rect.yMin + 5, EditorGUIUtility.labelWidth, rect.height );

        return EditorGUI.Toggle( toggleRect, toggle );
    }


    static bool DoContainerHeaderFoldout( string headline, bool foldout )
    {
        Rect rect = DoContainerHeader( "", 27, 0f );
        Rect foldoutRect = new Rect( rect.xMin + 15, rect.yMin + 5, rect.width, rect.height );

        return EditorGUI.Foldout( foldoutRect, foldout, headline, FoldoutBold );
    }

    static Rect DoContainerHeader( string headline, float height, float contentOffset )
    {
        GUILayout.Space( 5 );
        Rect controlRect = EditorGUILayout.GetControlRect( false, height );

        int controlID = GUIUtility.GetControlID( FocusType.Passive, controlRect );

        if( Event.current.type == EventType.Repaint )
        {
            PhotonGUI.DefaultTitleStyle.Draw( controlRect, GUIContent.none, controlID );

            Rect labelRect = new Rect( controlRect.xMin + 5 + contentOffset, controlRect.yMin + 5, controlRect.width, controlRect.height );
            GUI.Label( labelRect, headline, EditorStyles.boldLabel );
        }

        return controlRect;
    }
    #endregion
}
