package com.airbnb.lottie.model;

import static androidx.annotation.RestrictTo.Scope.LIBRARY;

import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;

import com.airbnb.lottie.value.LottieValueCallback;

import java.util.List;

/**
 * Any item that can be a part of a {@link KeyPath} should implement this.
 */
@RestrictTo(LIBRARY)
public interface KeyPathElement {

  /**
   * Called recursively during keypath resolution.
   * <p>
   * The overridden method should just call:
   * MiscUtils.resolveKeyPath(keyPath, depth, accumulator, currentPartialKeyPath, this);
   *
   * @param keyPath               The full keypath being resolved.
   * @param depth                 The current depth that this element should be checked at in the keypath.
   * @param accumulator           A list of fully resolved keypaths. If this element fully matches the
   *                              keypath then it should add itself to this list.
   * @param currentPartialKeyPath A keypath that contains all parent element of this one.
   *                              This element should create a copy of this and append itself
   *                              with KeyPath#addKey when it adds itself to the accumulator
   *                              or propagates resolution to its children.
   */
  void resolveKeyPath(
      KeyPath keyPath, int depth, List<KeyPath> accumulator, KeyPath currentPartialKeyPath);

  /**
   * The overridden method should handle appropriate properties and set value callbacks on their
   * animations.
   */
  <T> void addValueCallback(T property, @Nullable LottieValueCallback<T> callback);
}