using System;
using System.Windows;
using System.Windows.Controls;
using HandyControl.Tools;

namespace HandyControl.Controls
{
    public class RunningBorder : Border
    {
        private bool _test;

        protected override Size MeasureOverride(Size constraint)
        {
            if (_test)
            {
                _test = false;
                return constraint;
            }

            var child = Child;
            var borderThickness = BorderThickness;
            var padding = Padding;

            if (UseLayoutRounding)
            {
                var dpiScaleX = DpiHelper.DeviceDpiX;
                var dpiScaleY = DpiHelper.DeviceDpiY;

                borderThickness = new Thickness(
                    DpiHelper.RoundLayoutValue(borderThickness.Left, dpiScaleX),
                    DpiHelper.RoundLayoutValue(borderThickness.Top, dpiScaleY),
                    DpiHelper.RoundLayoutValue(borderThickness.Right, dpiScaleX),
                    DpiHelper.RoundLayoutValue(borderThickness.Bottom, dpiScaleY));
            }

            var borderSize = ConvertThickness2Size(borderThickness);
            var paddingSize = ConvertThickness2Size(padding);
            var mySize = new Size();

            if (child != null)
            {
                var combined = new Size(borderSize.Width + paddingSize.Width, borderSize.Height + paddingSize.Height);
                var borderConstraint = new Size(Math.Max(0.0, constraint.Width - combined.Width), Math.Max(0.0, constraint.Height - combined.Height));
                var childConstraint = new Size(Math.Max(0.0, double.PositiveInfinity - combined.Width), Math.Max(0.0, double.PositiveInfinity - combined.Height));


                child.Measure(borderConstraint);
                var childSize = child.DesiredSize;

                mySize.Width = childSize.Width + combined.Width;
                mySize.Height = childSize.Height + combined.Height;

                child.Measure(childConstraint);
            }
            else
            {
                mySize = new Size(borderSize.Width + paddingSize.Width, borderSize.Height + paddingSize.Height);
            }

            return mySize;
        }

        private static Size ConvertThickness2Size(Thickness th) => new Size(th.Left + th.Right, th.Top + th.Bottom);
    }
}
