using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace FluentNHibernate.MappingModel.Collections
{
    public interface ICollectionMapping : IMappingBase, IRelationship
    {
        CacheMapping Cache { get; set; }
        bool Inverse { get; set; }
        Lazy Lazy { get; set; }
        string Access { get; set; }
        string TableName { get; set; }
        string Schema { get; set; }
        string Fetch { get; set; }
        string Cascade { get; set; }
        string Where { get; set; }
		string OrderBy { get; set; }
        bool Mutable { get; set;}
        string Subselect { get; set; }
        TypeReference Persister { get; set; }
        string Name { get; set; }
        int BatchSize { get; set; }
        string Check { get; set; }
        TypeReference CollectionType { get; set; }
        string OptimisticLock { get; set; }
        bool Generic { get; set; }
        KeyMapping Key { get; set; }
        ICollectionRelationshipMapping Relationship { get; set; }
        Member Member { get; set;  }
        ElementMapping Element { get; set; }
        CompositeElementMapping CompositeElement { get; set; }
        Type ContainingEntityType { get; set; }
        Type ChildType { get; set; }
        IList<FilterMapping> Filters { get; }

        bool HasValue<TResult>(Expression<Func<ICollectionMapping, TResult>> property);
        void SetDefaultValue<TResult>(Expression<Func<ICollectionMapping, TResult>> property, TResult value);
    }
}