using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace TaskIt.Infrastructure
{
    public class ValidationScope
    {
        public static readonly DependencyProperty ErrorsProperty =
            DependencyProperty.RegisterAttached("Errors", typeof (IList<ValidationError>), typeof (ValidationScope), new PropertyMetadata(null, ErrorsChanged));

        public static IList<ValidationError> GetErrors(DependencyObject obj)
        {
            return (IList<ValidationError>) obj.GetValue(ErrorsProperty);
        }

        public static void SetErrors(DependencyObject obj, IList<ValidationError> value)
        {
            obj.SetValue(ErrorsProperty, value);
        }

        // Using a DependencyProperty as the backing store for Errors. This enables animation, styling, binding, etc...
        public static void ErrorsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            var element = (FrameworkElement) obj;
            element.BindingValidationError += (sender, e) =>
                {
                    if (e.Action == ValidationErrorEventAction.Added)
                    {
                        GetErrors(obj).Add(e.Error);
                    }
                    else
                    {
                        GetErrors(obj).Remove(e.Error);
                    }
                };
        }
    }
}