using System.Globalization;
using System.Reflection;
using System.Windows.Controls;
using System.Windows.Data;

namespace ValidationLibrary
{
    public class AttributeValidator : ValidationRule
    {
        public BindingExpression ExpressionToValidate { get; set; }

        public override ValidationResult Validate(object pValue, CultureInfo pCultureInfo)
        {
            bool lValid = true;

            if (ExpressionToValidate != null)
            {
                PropertyInfo lPropInfo = null;
                object lCurrentObject = ExpressionToValidate.DataItem;

                foreach (string iPropName in ExpressionToValidate.ParentBinding.Path.Path.Split('.'))
                {
                    lPropInfo = lCurrentObject.GetType().GetProperty(iPropName);
                    lCurrentObject = lPropInfo.GetValue(lCurrentObject, null);
                }

                object[] lAttributes = lPropInfo.GetCustomAttributes(typeof (ValidationAttribute), true);
                if (lAttributes.Length > 0)
                {
                    lValid = ((ValidationAttribute) lAttributes[0]).Validate(pValue);
                }
            }

            // TODO: Nachricht, am besten als Property im ValidationAttribut
            return new ValidationResult(lValid, null);
        }
    }
}