using Jint.Native;
using Jint.Runtime.Descriptors;

namespace Jint.Runtime.Interop.Reflection
{
    internal sealed class ConstantValueAccessor : ReflectionAccessor
    {
        public static readonly ConstantValueAccessor NullAccessor = new(null);

        public ConstantValueAccessor(JsValue? value) : base(null!, null!)
        {
            ConstantValue = value;
        }

        public override bool Writable => false;

        protected override JsValue? ConstantValue { get; }

        protected override object? DoGetValue(object target, string memberName)
        {
            return ConstantValue;
        }

        protected override void DoSetValue(object target, string memberName, object? value)
        {
            throw new InvalidOperationException();
        }

        public override PropertyDescriptor CreatePropertyDescriptor(Engine engine, object target, string memberName, bool enumerable = true)
        {
            return ConstantValue is null
                ? PropertyDescriptor.Undefined
                : new(ConstantValue, PropertyFlag.AllForbidden);
        }
    }
}
