using System.Linq.Expressions;

namespace NzbDrone.Common.EnsureThat
{
    internal static class ExpressionExtensions
    {
        internal static string ToPath(this MemberExpression e)
        {
            var path = "";
            var parent = e.Expression as MemberExpression;

            if (parent != null)
                path = parent.ToPath() + ".";

            return path + e.Member.Name;
        }

        internal static MemberExpression GetRightMostMember(this Expression e)
        {
			if (e is LambdaExpression)
				return GetRightMostMember(((LambdaExpression)e).Body);

			if (e is MemberExpression)
				return (MemberExpression)e;

			if (e is MethodCallExpression)
			{
				var callExpression = (MethodCallExpression)e;

				if (callExpression.Object is MethodCallExpression || callExpression.Object is MemberExpression)
					return GetRightMostMember(callExpression.Object);

				var member = callExpression.Arguments.Count > 0 ? callExpression.Arguments[0] : callExpression.Object;
				return GetRightMostMember(member);
			}

			if (e is UnaryExpression)
			{
				var unaryExpression = (UnaryExpression)e;
				return GetRightMostMember(unaryExpression.Operand);
			}

            return null;
        }
    }
}