// Copyright 2023 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.analysis.producers;

import com.google.devtools.build.lib.analysis.TransitiveDependencyState;
import com.google.devtools.build.lib.causes.LoadingFailedCause;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
import com.google.devtools.build.lib.skyframe.PackageValue;
import com.google.devtools.build.lib.util.DetailedExitCode;
import com.google.devtools.build.skyframe.SkyValue;
import com.google.devtools.build.skyframe.state.StateMachine;
import com.google.devtools.build.skyframe.state.StateMachine.ValueOrExceptionSink;
import javax.annotation.Nullable;
import net.starlark.java.syntax.Location;

/**
 * Looks up a {@link Target} from its {@link Package} using its {@link Label}.
 *
 * <p>This is used by the {@link TargetAndConfigurationProducer}. In contrast to the target lookup
 * in {@link ConfiguredTargetAndDataProducer}, this one does not assume that target presence has
 * already been verified.
 */
final class TargetProducer implements StateMachine, ValueOrExceptionSink<NoSuchPackageException> {
  interface ResultSink {
    void acceptTarget(Target target);

    void acceptTargetError(NoSuchPackageException error);

    void acceptTargetError(NoSuchTargetException error, Location location);
  }

  // -------------------- Input --------------------
  private final Label label;
  private final TransitiveDependencyState transitiveState;

  // -------------------- Output --------------------
  private final ResultSink sink;

  // -------------------- Sequencing --------------------
  private final StateMachine runAfter;

  // -------------------- Internal State --------------------
  private Package pkg;

  TargetProducer(
      Label label,
      TransitiveDependencyState transitiveState,
      ResultSink sink,
      StateMachine runAfter) {
    this.label = label;
    this.transitiveState = transitiveState;
    this.sink = sink;
    this.runAfter = runAfter;
  }

  @Override
  public StateMachine step(Tasks tasks, ExtendedEventHandler listener) {
    tasks.lookUp(
        label.getPackageIdentifier(),
        NoSuchPackageException.class,
        (ValueOrExceptionSink<NoSuchPackageException>) this);
    return this::unwrapTarget;
  }

  @Override
  public void acceptValueOrException(
      @Nullable SkyValue value, @Nullable NoSuchPackageException error) {
    if (value != null) {
      this.pkg = ((PackageValue) value).getPackage();
      transitiveState.putDependencyPackageIfAbsent(label.getPackageIdentifier(), pkg);
      return;
    }

    sink.acceptTargetError(error);
  }

  private StateMachine unwrapTarget(Tasks tasks, ExtendedEventHandler listener) {
    if (pkg == null) {
      return DONE; // An error occurred.
    }

    Target target;
    try {
      target = pkg.getTarget(label.getName());
    } catch (NoSuchTargetException e) {
      sink.acceptTargetError(e, pkg.getBuildFile().getLocation());
      return runAfter;
    }

    if (pkg.containsErrors()) {
      FailureDetail failureDetail = pkg.contextualizeFailureDetailForTarget(target);
      transitiveState.addTransitiveCause(
          new LoadingFailedCause(label, DetailedExitCode.of(failureDetail)));
    }
    transitiveState.updateTransitivePackages(pkg);
    sink.acceptTarget(target);
    return runAfter;
  }
}
