/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.facebook.react.animated

import com.facebook.react.bridge.ReadableMap

/**
 * Basic type of animated node that maps directly from {@code Animated.Value(x)} of Animated.js
 * library.
 */
internal open class ValueAnimatedNode(config: ReadableMap? = null) : AnimatedNode() {
  @JvmField internal var nodeValue: Double = config?.getDouble("value") ?: Double.NaN
  @JvmField internal var offset: Double = config?.getDouble("offset") ?: 0.0
  private var valueListener: AnimatedNodeValueListener? = null

  fun getValue(): Double {
    if ((offset + nodeValue).isNaN()) {
      this.update()
    }
    return offset + nodeValue
  }

  open fun getAnimatedObject(): Any? = null

  fun flattenOffset() {
    nodeValue += offset
    offset = 0.0
  }

  fun extractOffset() {
    offset += nodeValue
    nodeValue = 0.0
  }

  fun onValueUpdate() {
    valueListener?.onValueUpdate(getValue() - offset, offset)
  }

  fun setValueListener(listener: AnimatedNodeValueListener?) {
    valueListener = listener
  }

  override fun prettyPrint(): String = "ValueAnimatedNode[$tag]: value: $nodeValue offset: $offset"
}
