﻿using System.Globalization;
using System.Reflection;
using Jint.Native;

namespace Jint.Runtime.Descriptors.Specialized
{
    public sealed class FieldInfoDescriptor : PropertyDescriptor
    {
        private readonly Engine _engine;
        private readonly FieldInfo _fieldInfo;
        private readonly object _item;

        public FieldInfoDescriptor(Engine engine, FieldInfo fieldInfo, object item)
        {
            _engine = engine;
            _fieldInfo = fieldInfo;
            _item = item;

            Writable = true; // !fieldInfo.Attributes.HasFlag(FieldAttributes.InitOnly); // don't write to fields marked as readonly
        }

        public override JsValue Value
        {
            get
            {
                return JsValue.FromObject(_engine, _fieldInfo.GetValue(_item));
            }

            set
            {
                var currentValue = value;
                object obj;
                if (_fieldInfo.FieldType == typeof (JsValue))
                {
                    obj = currentValue;
                }
                else
                {
                    // attempt to convert the JsValue to the target type
                    obj = currentValue.ToObject();
                    if (obj.GetType() != _fieldInfo.FieldType)
                    {
                        obj = _engine.ClrTypeConverter.Convert(obj, _fieldInfo.FieldType, CultureInfo.InvariantCulture);
                    }
                }

                _fieldInfo.SetValue(_item, obj);
            }
        }
    }
}
