using System.Windows;
using System.Windows.Data;
using System.Windows.Shapes;
using HandyControl.Data;
using HandyControl.Tools.Converter;

namespace HandyControl.Controls
{
    public class RectangleAttach
    {
        public static readonly DependencyProperty CircularProperty = DependencyProperty.RegisterAttached(
            "Circular", typeof(bool), typeof(RectangleAttach), new PropertyMetadata(ValueBoxes.FalseBox, OnCircularChanged));

        private static void OnCircularChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is Rectangle rectangle)
            {
                if ((bool) e.NewValue)
                {
                    var binding = new MultiBinding
                    {
                        Converter = new RectangleCircularConverter()
                    };
                    binding.Bindings.Add(new Binding(FrameworkElement.ActualWidthProperty.Name) { Source = rectangle });
                    binding.Bindings.Add(new Binding(FrameworkElement.ActualHeightProperty.Name) { Source = rectangle });
                    rectangle.SetBinding(Rectangle.RadiusXProperty, binding);
                    rectangle.SetBinding(Rectangle.RadiusYProperty, binding);
                }
                else
                {
                    BindingOperations.ClearBinding(rectangle, FrameworkElement.ActualWidthProperty);
                    BindingOperations.ClearBinding(rectangle, FrameworkElement.ActualHeightProperty);
                    BindingOperations.ClearBinding(rectangle, Rectangle.RadiusXProperty);
                    BindingOperations.ClearBinding(rectangle, Rectangle.RadiusYProperty);
                }
            }
        }

        public static void SetCircular(DependencyObject element, bool value)
            => element.SetValue(CircularProperty, ValueBoxes.BooleanBox(value));

        public static bool GetCircular(DependencyObject element)
            => (bool) element.GetValue(CircularProperty);
    }
}
