using System;
using System.Linq;
using System.Linq.Expressions;
using Marr.Data;
using Marr.Data.Mapping;

namespace NzbDrone.Core.Datastore
{
    public static class RelationshipExtensions
    {
        public static RelationshipBuilder<TParent> HasOne<TParent, TChild>(this RelationshipBuilder<TParent> relationshipBuilder, Expression<Func<TParent, LazyLoaded<TChild>>> portalExpression, Func<TParent, int> childIdSelector)
            where TParent : ModelBase
            where TChild : ModelBase
        {
            return relationshipBuilder.For(portalExpression.GetMemberName())
                                .LazyLoad(
                                            query: (db, parent) => db.Query<TChild>().SingleOrDefault(c => c.Id == childIdSelector(parent)),
                                            condition: parent => childIdSelector(parent) > 0
                                         );

        }

        public static RelationshipBuilder<TParent> Relationship<TParent>(this ColumnMapBuilder<TParent> mapBuilder)
        {
            return mapBuilder.Relationships.AutoMapComplexTypeProperties<ILazyLoaded>();
        }



        public static RelationshipBuilder<TParent> HasMany<TParent, TChild>(this RelationshipBuilder<TParent> relationshipBuilder, Expression<Func<TParent, LazyList<TChild>>> portalExpression, Func<TParent, int> childIdSelector)
            where TParent : ModelBase
            where TChild : ModelBase
        {
            return relationshipBuilder.For(portalExpression.GetMemberName())
                   .LazyLoad((db, parent) => db.Query<TChild>().Where(c => c.Id == childIdSelector(parent)).ToList());


        }

        private static string GetMemberName<T, TMember>(this Expression<Func<T, TMember>> member)
        {
            var expression = member.Body as MemberExpression;

            if (expression == null)
            {
                expression = (MemberExpression)((UnaryExpression)member.Body).Operand;
            }

            return expression.Member.Name;
        }
    }
}