using System;
using System.Linq;
using System.Linq.Expressions;

namespace InABox.Core
{
    
    public interface IAutoEntityCrossGenerator : IAutoEntityGenerator
    {
        String LeftEntity();
        String LeftProperty();
        String LeftMapping();
        String LeftLink();

        String RightEntity();
        String RightProperty();
        String RightMapping();
        String RightLink();
    }
    
    public abstract class AutoEntityCrossGenerator<TInterface, TLeft, TRight> : IAutoEntityCrossGenerator
    {
        public abstract Expression<Func<TLeft, Guid>> LeftProperty { get; }
        public abstract Expression<Func<TInterface, Guid>> LeftMapping { get; }
        public abstract Expression<Func<TLeft, Guid>> LeftLink { get; }
        
        public abstract Expression<Func<TRight, Guid>> RightProperty { get; }
        public abstract Expression<Func<TInterface, Guid>> RightMapping { get; }
        public abstract Expression<Func<TRight, Guid>> RightLink { get; }

        public string LeftEntity() => typeof(TLeft).EntityName().Split('.').Last();
    
        string IAutoEntityCrossGenerator.LeftProperty() => CoreUtils.GetFullPropertyName(LeftProperty, ".");

        string IAutoEntityCrossGenerator.LeftMapping() => CoreUtils.GetFullPropertyName(LeftMapping, ".");

        string IAutoEntityCrossGenerator.LeftLink() => CoreUtils.GetFullPropertyName(LeftLink, ".");

        public string RightEntity() => typeof(TRight).EntityName().Split('.').Last();

        string IAutoEntityCrossGenerator.RightProperty() => CoreUtils.GetFullPropertyName(RightProperty, ".");

        string IAutoEntityCrossGenerator.RightMapping() => CoreUtils.GetFullPropertyName(RightMapping, ".");

        string IAutoEntityCrossGenerator.RightLink() => CoreUtils.GetFullPropertyName(RightLink, ".");

        public abstract bool Distinct { get; }
        
        public Type Definition => typeof(TInterface);

        public abstract Column<TInterface>[] IDColumns { get; }

        IColumn[] IAutoEntityGenerator.IDColumns => IDColumns;
    }
}