// Copyright 2022 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.skyframe;

import static com.google.devtools.build.lib.skyframe.ArtifactConflictFinder.NUM_JOBS;

import com.google.devtools.build.lib.actions.ActionLookupKey;
import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
import com.google.devtools.build.lib.analysis.configuredtargets.OutputFileConfiguredTarget;
import com.google.devtools.build.lib.bugreport.BugReport;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
import com.google.devtools.build.lib.concurrent.Sharder;
import com.google.devtools.build.skyframe.SkyValue;

/** Represents the traversal of the ActionLookupValues in a build. */
public class ActionLookupValuesTraversal {
  // Some metrics indicate this is a rough average # of ALVs in a build.
  private final Sharder<ActionLookupValue> actionLookupValueShards =
      new Sharder<>(NUM_JOBS, /* expectedTotalSize= */ 200_000);

  // Metrics.
  private int configuredObjectCount = 0;
  private int configuredTargetCount = 0;
  private int actionCount = 0;
  private int actionCountNotIncludingAspects = 0;
  private int inputFileConfiguredTargetCount = 0;
  private int outputFileConfiguredTargetCount = 0;
  private int otherConfiguredTargetCount = 0;

  public ActionLookupValuesTraversal() {}

  void accumulate(ActionLookupKey keyForDebugging, SkyValue value) {
    boolean isConfiguredTarget = value instanceof ConfiguredTargetValue;
    boolean isActionLookupValue = value instanceof ActionLookupValue;
    if (!isConfiguredTarget && !isActionLookupValue) {
      BugReport.sendBugReport(
          new IllegalStateException(
              String.format(
                  "Should only be called with ConfiguredTargetValue or ActionLookupValue: %s %s"
                      + " %s",
                  value.getClass(), keyForDebugging, value)));
      return;
    }
    configuredObjectCount++;
    if (isConfiguredTarget) {
      configuredTargetCount++;
    }
    if (isActionLookupValue) {
      ActionLookupValue alv = (ActionLookupValue) value;
      int numActions = alv.getNumActions();
      actionCount += numActions;
      if (isConfiguredTarget) {
        actionCountNotIncludingAspects += numActions;
      }
      actionLookupValueShards.add(alv);
      return;
    }
    if (!(value instanceof NonRuleConfiguredTargetValue)) {
      BugReport.sendBugReport(
          new IllegalStateException(
              String.format(
                  "Unexpected value type: %s %s %s", value.getClass(), keyForDebugging, value)));
      return;
    }
    ConfiguredTarget configuredTarget =
        ((NonRuleConfiguredTargetValue) value).getConfiguredTarget();
    if (configuredTarget instanceof InputFileConfiguredTarget) {
      inputFileConfiguredTargetCount++;
    } else if (configuredTarget instanceof OutputFileConfiguredTarget) {
      outputFileConfiguredTargetCount++;
    } else {
      otherConfiguredTargetCount++;
    }
  }

  Sharder<ActionLookupValue> getActionLookupValueShards() {
    return actionLookupValueShards;
  }

  int getActionCount() {
    return actionCount;
  }

  BuildEventStreamProtos.BuildMetrics.BuildGraphMetrics.Builder getMetrics() {
    return BuildEventStreamProtos.BuildMetrics.BuildGraphMetrics.newBuilder()
        .setActionLookupValueCount(configuredObjectCount)
        .setActionLookupValueCountNotIncludingAspects(configuredTargetCount)
        .setActionCount(actionCount)
        .setActionCountNotIncludingAspects(actionCountNotIncludingAspects)
        .setInputFileConfiguredTargetCount(inputFileConfiguredTargetCount)
        .setOutputFileConfiguredTargetCount(outputFileConfiguredTargetCount)
        .setOtherConfiguredTargetCount(otherConfiguredTargetCount);
  }
}
