package com.airbnb.lottie.utils;

import androidx.core.os.TraceCompat;

public class LottieTrace {
  private static final int MAX_DEPTH = 20;

  private final String[] sections = new String[MAX_DEPTH];
  private final long[] startTimeNs = new long[MAX_DEPTH];
  private int traceDepth = 0;
  private int depthPastMaxDepth = 0;

  public void beginSection(String section) {
    if (traceDepth == MAX_DEPTH) {
      depthPastMaxDepth++;
      return;
    }
    sections[traceDepth] = section;
    startTimeNs[traceDepth] = System.nanoTime();
    //noinspection deprecation
    TraceCompat.beginSection(section);
    traceDepth++;
  }

  public float endSection(String section) {
    if (depthPastMaxDepth > 0) {
      depthPastMaxDepth--;
      return 0;
    }
    traceDepth--;
    if (traceDepth == -1) {
      throw new IllegalStateException("Can't end trace section. There are none.");
    }
    if (!section.equals(sections[traceDepth])) {
      throw new IllegalStateException("Unbalanced trace call " + section +
          ". Expected " + sections[traceDepth] + ".");
    }
    //noinspection deprecation
    TraceCompat.endSection();
    return (System.nanoTime() - startTimeNs[traceDepth]) / 1000000f;
  }
}
