using System;
using System.Windows;
using System.Windows.Controls.Primitives;

namespace VPet_Simulator.Windows
{
    public class AutoUniformGrid
   : UniformGrid
    {

        #region ItemsMinWidth
        public double ItemsMinWidth
        {
            get { return (double)GetValue(ItemsMinWidthProperty); }
            set { SetValue(ItemsMinWidthProperty, value); }
        }

        public static readonly DependencyProperty ItemsMinWidthProperty =
            DependencyProperty.Register("ItemsMinWidth", typeof(double), typeof(AutoUniformGrid), new PropertyMetadata(double.NaN));
        #endregion

        #region ItemsMinHeight
        public double ItemsMinHeight
        {
            get { return (double)GetValue(ItemsMinHeightProperty); }
            set { SetValue(ItemsMinHeightProperty, value); }
        }

        public static readonly DependencyProperty ItemsMinHeightProperty =
            DependencyProperty.Register("ItemsMinHeight", typeof(double), typeof(AutoUniformGrid), new PropertyMetadata(double.NaN));
        #endregion

        public event RoutedEventHandler Changed
        {
            add { AddHandler(ChangedEvent, value); }
            remove { RemoveHandler(ChangedEvent, value); }
        }

        public static readonly RoutedEvent ChangedEvent =
            EventManager.RegisterRoutedEvent("Changed", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AutoUniformGrid));


        protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
        {
            base.OnRenderSizeChanged(sizeInfo);

            var isChanged = false;
            if (!double.IsNaN(ItemsMinWidth))
            {
                var columns = (int)Math.Floor(sizeInfo.NewSize.Width / ItemsMinWidth);
                if (Columns != columns)
                {
                    isChanged = true;
                }
                SetCurrentValue(ColumnsProperty, columns);
            }
            if (!double.IsNaN(ItemsMinHeight))
            {
                var rows = (int)Math.Floor(sizeInfo.NewSize.Height / ItemsMinHeight);
                if (Rows != rows)
                {
                    isChanged = true;
                }
                SetCurrentValue(RowsProperty, rows);
            }
            if (isChanged)
            {
                RaiseEvent(new RoutedEventArgs(ChangedEvent));
            }
        }
    }

}