using System;
using System.Drawing;
using System.Windows.Forms;
using GitCommands;
using ResourceManager;

namespace GitUI.Help
{
    public partial class HelpImageDisplayUserControl : GitExtensionsControl
    {
        private Image _image1;
        private Image _image2;
        private bool _isExpanded;

        ////public const string fastForwardHoverText = "Hover to see scenario when fast forward is possible.";

        private bool _isLoaded;

        public HelpImageDisplayUserControl()
        {
            InitializeComponent();
            InitializeComplete();
        }

        /// <summary>
        /// NOTE: will also be called if designer code calls "this.helpImageDisplayUserControl1.ShowImage2OnHover = true;"
        /// </summary>
        private void HelpImageDisplayUserControl_Load(object sender, EventArgs e)
        {
            IsExpanded = LoadIsExpandedValueFromSettings(IsExpanded);
            UpdateIsExpandedState();
            UpdateImageDisplay();
            UpdateControlSize();

            _isLoaded = true;
        }

        public bool IsExpanded
        {
            get { return _isExpanded; }
            set
            {
                _isExpanded = value;
                UpdateIsExpandedState();

                if (_isLoaded)
                {
                    // to avoid calling this when InitializeComponents is called
                    /*
                     * ...
                                this.helpImageDisplayUserControl1.IsExpanded = false;                       // this before...
                                this.helpImageDisplayUserControl1.Location = new System.Drawing.Point(3, 3);
                                this.helpImageDisplayUserControl1.MinimumSize = new System.Drawing.Size(30, 50);
                                this.helpImageDisplayUserControl1.Name = "helpImageDisplayUserControl1";    // ...this gives wrong id!!!
                     * ...

                     */

                    SaveIsExpandedValueInSettings(value);
                }
            }
        }

        public string UniqueIsExpandedSettingsId { get; set; }

        private void UpdateIsExpandedState()
        {
            if (_isExpanded)
            {
                linkLabelHide.Visible = true;

                buttonShowHelp.Visible = false;
                //// linkLabelShowHelp.Visible = false; // Why use button instead of label? Because button has constant width independent of language!

                pictureBox1.Visible = true;
                labelHoverText.Visible = IsOnHoverShowImage2;
            }
            else
            {
                linkLabelHide.Visible = false;

                buttonShowHelp.Visible = true;
                ////linkLabelShowHelp.Visible = true;

                pictureBox1.Visible = false;
                labelHoverText.Visible = false;
            }

            UpdateControlSize();
        }

        public Image Image1
        {
            get { return _image1; }
            set
            {
                _image1 = value;
                UpdateImageDisplay();
                if (IsExpanded)
                {
                    UpdateControlSize();
                }
            }
        }

        public Image Image2
        {
            get { return _image2; }
            set
            {
                _image2 = value;
                UpdateImageDisplay();
                if (IsExpanded)
                {
                    UpdateControlSize();
                }
            }
        }

        /// <summary>
        /// see also IsOnHoverShowImage2NoticeText
        /// </summary>
        public bool IsOnHoverShowImage2
        {
            get { return _showImage2OnHover; }
            set
            {
                _showImage2OnHover = value;
                if (_isLoaded)
                {
                    UpdateIsExpandedState();
                    ////labelHoverText.Visible = value; // NOTE: would trigger OnLoad
                }
            }
        }

        /// <summary>
        /// only shown when IsOnHoverShowImage2 is true
        /// </summary>
        public string IsOnHoverShowImage2NoticeText
        {
            get => labelHoverText.Text;
            set => labelHoverText.Text = value;
        }

        private bool _isHover;
        private bool _showImage2OnHover;

        private bool IsHovering()
        {
            return _isHover;
        }

        private string GetId()
        {
            return UniqueIsExpandedSettingsId ?? "MUST_BE_SET";
        }

        private void SaveIsExpandedValueInSettings(bool value)
        {
            AppSettings.SetBool("HelpIsExpanded" + GetId(), value);
        }

        private bool LoadIsExpandedValueFromSettings(bool defaultValue)
        {
            return AppSettings.GetBool("HelpIsExpanded" + GetId(), defaultValue);
        }

        private void UpdateControlSize()
        {
            Size size;
            if (IsExpanded)
            {
                if (_image1 != null && _image2 == null)
                {
                    size = Image1.Size;
                }
                else if (_image1 != null && Image2 != null)
                {
                    int w = Math.Max(_image1.Size.Width, _image2.Width);
                    int h = Math.Max(_image1.Size.Height, _image2.Height);
                    size = new Size(w, h);
                }
                else
                {
                    size = new Size(40, 40); // default size
                }

                // add vertical space of other controls
                size.Height +=
                    /*labelHoverText.Height too much because when collapsed there is much wordwrap, use fixed value 30*/ 30
                    + flowLayoutPanel1.Height;
            }
            else
            {
                size = new Size(30, 50); // size for "show help" button
            }

            // apply size to control
            var form = TopLevelControl as Form;
            var s = new Size();
            var ms = new Size();
            if (form != null)
            {
                s = form.Size;
                s.Width -= Size.Width;
                ms = form.MinimumSize;
                if (!ms.IsEmpty)
                {
                    ms.Width -= Size.Width;
                    form.MinimumSize = new Size();
                }
            }

            Size = size;
            MinimumSize = size;
            if (form != null)
            {
                s.Width += Size.Width;
                form.Size = s;
                if (!ms.IsEmpty)
                {
                    ms.Width += Size.Width;
                    form.MinimumSize = ms;
                }
            }
        }

        private void UpdateImageDisplay()
        {
            if (!IsOnHoverShowImage2)
            {
                pictureBox1.Image = Image1;
                return;
            }

            pictureBox1.Image = IsHovering()
                ? Image2
                : Image1;
        }

        private void HelpImageDisplayUserControl_MouseEnter(object sender, EventArgs e)
        {
            if (IsOnHoverShowImage2)
            {
                _isHover = true;
                UpdateImageDisplay();
            }
        }

        private void HelpImageDisplayUserControl_MouseLeave(object sender, EventArgs e)
        {
            if (IsOnHoverShowImage2)
            {
                _isHover = false;
                UpdateImageDisplay();
            }
        }

        private void linkLabelHide_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            IsExpanded = false;
        }

        private void buttonShowHelp_Click(object sender, EventArgs e)
        {
            IsExpanded = true;
        }

        private void linkLabelShowHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            IsExpanded = true;
        }
    }
}