namespace RyzStudio.Windows.ThemedForms
{
    using RyzStudio.Drawing;
    using System;
	using System.ComponentModel;
	using System.Drawing;
    using System.Windows.Forms;

    public partial class TButtonTextBox : RyzStudio.Windows.ThemedForms.TUserControl
	{
        protected readonly Padding textboxPadding = new Padding(6, 6, 6, 6);

		public TButtonTextBox() : base()
        {
            InitializeComponent();

            //this.Margin = new Padding(10, 6, 10, 6);
            this.Margin = new Padding(10, 3, 3, 3);
            this.Font = new Font(this.Font, FontStyle.Regular);

            textBox1.Font = this.Font;
            textBox1.Left = this.Margin.Left;
            textBox1.PreviewKeyDown += textBox_PreviewKeyDown;

            imageBox1.Click += imageBox1_Click;

            OnResize(null);
        }

        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);

            int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;

            this.Height = textBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom);

            imageBox1.Width = 18;
            imageBox1.Height = textBox1.Height + textboxPadding.Top + textboxPadding.Bottom;
            imageBox1.Left = this.Width - (this.Margin.Right + b + imageBox1.Width);

            textBox1.Left = this.Margin.Left;
            textBox1.Width = imageBox1.Left - textBox1.Left - 3;
            textBox1.Top = (int)Math.Ceiling(decimal.Divide((this.Height - textBox1.Height), 2));
        }

        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);

            textBox1.Focus();
        }

        protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Enter:
                    if (this.SubmitButton != null)
                    {
                        this.SubmitButton.PerformClick();
                    }

                    break;
                case Keys.Escape:
                    close();
                    break;
                default: break;
            }
        }

        protected virtual void imageBox1_Click(object sender, EventArgs e) => OnButtonClick?.Invoke(sender, e);

        [Category("Action")]
        [Browsable(true)]
        public event EventHandler OnButtonClick;

        [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
        [Category("Appearance")]
        public Forms.TImageBox InnerImageBox { get => imageBox1; set => imageBox1 = value; }

        [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
		[Category("Appearance")]
		public System.Windows.Forms.TextBox InnerTextBox { get => textBox1; set => textBox1 = value; }

        [Category("Appearance"), Browsable(true)]
        public Image NormalImage { get => imageBox1.ImageNormal; set => imageBox1.ImageNormal = value; }

        [Category("Appearance"), Browsable(true)]
        public Image HighlightImage { get => imageBox1.ImageHover; set => imageBox1.ImageHover = value; }

        [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
        [Category("Appearance")]
        public new string Text
        {
            get => textBox1.Text;
            set
            {
                textBox1.Text = value;
                textBox1.SelectionStart = textBox1.Text.Length;
            }
        }

        [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
        [Category("Appearance")]
        public bool UseSystemPasswordChar { get => textBox1.UseSystemPasswordChar; set => textBox1.UseSystemPasswordChar = value; }

        [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)]
        [Category("Appearance")]
        public TButton SubmitButton { get; set; } = null;

        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new Padding Margin { get => base.Margin; set => base.Margin = value; }

        protected override void updateBackground(Graphics g, ThemeStyle style)
        {
            int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding;

            this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom));

            Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth);
            g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath());
            g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath());
        }

    }
}