using System.Collections;
using Spring.Expressions;
using Spring.Validation;

namespace Spring.DataBinding
{
    /// <summary>
    /// <see cref="IBindingContainer"/> implementation that allows
    /// data binding between collections that implement <see cref="IList"/>
    /// interface.
    /// </summary>
    /// <author>Aleksandar Seovic</author>
    public class ListBinding : AbstractBinding
    {
        private IExpression sourceExpression = Expression.Parse("#source = #target");
        private IExpression targetExpression = Expression.Parse("#target = #source");
        
        /// <summary>
        /// Binds source object to target object.
        /// </summary>
        /// <param name="source">
        /// The source object.
        /// </param>
        /// <param name="target">
        /// The target object.
        /// </param>
        /// <param name="validationErrors">
        /// Validation errors collection that type conversion errors should be added to.
        /// </param>
        /// <param name="variables">
        /// Variables that should be used during expression evaluation.
        /// </param>
        public override void BindSourceToTarget(object source, object target, IValidationErrors validationErrors,
                                                IDictionary variables)
        {
            if (variables == null)
            {
                variables = new Hashtable();
            }
            variables["source"] = source;
            variables["target"] = target;

            targetExpression.GetValue(null, variables);
        }

        /// <summary>
        /// Binds target object to source object.
        /// </summary>
        /// <param name="source">
        /// The source object.
        /// </param>
        /// <param name="target">
        /// The target object.
        /// </param>
        /// <param name="validationErrors">
        /// Validation errors collection that type conversion errors should be added to.
        /// </param>
        /// <param name="variables">
        /// Variables that should be used during expression evaluation.
        /// </param>
        public override void BindTargetToSource(object source, object target, IValidationErrors validationErrors,
                                                IDictionary variables)
        {
            if (variables == null)
            {
                variables = new Hashtable();
            }
            variables["source"] = source;
            variables["target"] = target;

            sourceExpression.GetValue(null, variables);
        }
    }
}