using System;
using System.Linq;

namespace InABox.Core
{
    
    public interface IEnclosedEntity : ISubObject
    {
    }
    
    public abstract class EnclosedEntity : BaseObject, IEnclosedEntity
    {

        private BaseObject? _linkedParent;

        private string? _linkedPath;

        public void SetLinkedParent(BaseObject parent)
        {
            _linkedParent = parent;
        }

        public void SetLinkedPath(string path)
        {
            _linkedPath = path;
        }

        protected override IOriginalValues CreateOriginalValues()
        {
            return new SubObjectOriginalValues(this);
        }

        protected override ILoadedColumns CreateLoadedColumns()
        {
            return new SubObjectLoadedColumns(this);
        }

        public BaseObject? GetLinkedParent() => _linkedParent;

        public string? GetLinkedPath() => _linkedPath;
        
        protected override void DoPropertyChanged(string name, object? before, object? after)
        {
            LinkedProperties.GetParent(this)?.CascadePropertyChanged(LinkedProperties.GetPath(this) + "." + name, before, after);

            if (LinkedProperties.Find(this, name, out var link, out var parent))
            {
                link.Update(this, parent);
            }
        }
    }
}