using UnityEngine;

namespace Cryville.Crtr.Config.UI {
	public abstract class PropertyValuePanel : MonoBehaviour {
		IPropertyAdapter _property;
		public void Init(IPropertyAdapter property) {
			_property = property;
			_property.ValueChanged += GetValue;
			GetValue();
		}
		protected object[] Range { get { return _property.Range; } }
		public object MappedValue { get; private set; }
		private object m_rawValue;
		public object RawValue {
			get { return m_rawValue; }
			set {
				m_rawValue = value;
				SetValue();
			}
		}
		protected abstract void OnValueUpdated();
		void GetValue() {
			if (_property.SetMapped) {
				MappedValue = _property.GetValue();
				m_rawValue = _property.MapValueInverse(MappedValue);
			}
			else {
				m_rawValue = _property.GetValue();
				MappedValue = _property.MapValue(m_rawValue);
			}
			OnValueUpdated();
		}
		void SetValue() {
			var outRaw = RawValue;
			MappedValue = _property.MapValue(outRaw);
			_property.SetValue(_property.SetMapped ? MappedValue : outRaw);
			OnValueUpdated();
		}
	}
}
