// 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.ActionLookupKeyOrProxy;
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(ActionLookupKeyOrProxy 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);
  }
}
