using UnityEngine;
using FairyGUI.Utils;

namespace FairyGUI
{
    /// <summary>
    /// GLabel class.
    /// </summary>
    public class GLabel : GComponent, IColorGear
    {
        protected GObject _titleObject;
        protected GObject _iconObject;

        public GLabel()
        {
        }

        /// <summary>
        /// Icon of the label.
        /// </summary>
        override public string icon
        {
            get
            {
                if (_iconObject != null)
                    return _iconObject.icon;
                else
                    return null;
            }

            set
            {
                if (_iconObject != null)
                    _iconObject.icon = value;
                UpdateGear(7);
            }
        }

        /// <summary>
        /// Title of the label.
        /// </summary>
        public string title
        {
            get
            {
                if (_titleObject != null)
                    return _titleObject.text;
                else
                    return null;
            }
            set
            {
                if (_titleObject != null)
                    _titleObject.text = value;
                UpdateGear(6);
            }
        }

        /// <summary>
        /// Same of the title.
        /// </summary>
        override public string text
        {
            get { return this.title; }
            set { this.title = value; }
        }

        /// <summary>
        /// If title is input text.
        /// </summary>
        public bool editable
        {
            get
            {
                if (_titleObject is GTextInput)
                    return _titleObject.asTextInput.editable;
                else
                    return false;
            }

            set
            {
                if (_titleObject is GTextInput)
                    _titleObject.asTextInput.editable = value;
            }
        }

        /// <summary>
        /// Title color of the label
        /// </summary>
        public Color titleColor
        {
            get
            {
                GTextField tf = GetTextField();
                if (tf != null)
                    return tf.color;
                else
                    return Color.black;
            }
            set
            {
                GTextField tf = GetTextField();
                if (tf != null)
                {
                    tf.color = value;
                    UpdateGear(4);
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public int titleFontSize
        {
            get
            {
                GTextField tf = GetTextField();
                if (tf != null)
                    return tf.textFormat.size;
                else
                    return 0;
            }
            set
            {
                GTextField tf = GetTextField();
                if (tf != null)
                {
                    TextFormat format = tf.textFormat;
                    format.size = value;
                    tf.textFormat = format;
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public Color color
        {
            get { return this.titleColor; }
            set { this.titleColor = value; }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public GTextField GetTextField()
        {
            if (_titleObject is GTextField)
                return (GTextField)_titleObject;
            else if (_titleObject is GLabel)
                return ((GLabel)_titleObject).GetTextField();
            else if (_titleObject is GButton)
                return ((GButton)_titleObject).GetTextField();
            else
                return null;
        }

        override protected void ConstructExtension(ByteBuffer buffer)
        {
            _titleObject = GetChild("title");
            _iconObject = GetChild("icon");
        }

        override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
        {
            base.Setup_AfterAdd(buffer, beginPos);

            if (!buffer.Seek(beginPos, 6))
                return;

            if ((ObjectType)buffer.ReadByte() != packageItem.objectType)
                return;

            string str;
            str = buffer.ReadS();
            if (str != null)
                this.title = str;
            str = buffer.ReadS();
            if (str != null)
                this.icon = str;
            if (buffer.ReadBool())
                this.titleColor = buffer.ReadColor();
            int iv = buffer.ReadInt();
            if (iv != 0)
                this.titleFontSize = iv;

            if (buffer.ReadBool())
            {
                GTextInput input = GetTextField() as GTextInput;
                if (input != null)
                {
                    str = buffer.ReadS();
                    if (str != null)
                        input.promptText = str;

                    str = buffer.ReadS();
                    if (str != null)
                        input.restrict = str;

                    iv = buffer.ReadInt();
                    if (iv != 0)
                        input.maxLength = iv;
                    iv = buffer.ReadInt();
                    if (iv != 0)
                        input.keyboardType = iv;
                    if (buffer.ReadBool())
                        input.displayAsPassword = true;
                }
                else
                    buffer.Skip(13);
            }

            if (buffer.version >= 5)
            {
                string sound = buffer.ReadS();
                if (!string.IsNullOrEmpty(sound))
                {
                    float volumeScale = buffer.ReadFloat();
                    displayObject.onClick.Add(() =>
                    {
                        NAudioClip audioClip = UIPackage.GetItemAssetByURL(sound) as NAudioClip;
                        if (audioClip != null && audioClip.nativeClip != null)
                            Stage.inst.PlayOneShotSound(audioClip.nativeClip, volumeScale);
                    });
                }
                else
                    buffer.Skip(4);
            }
        }
    }
}
