// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.errors;

import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.Keep;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.utils.AndroidApiLevel;

@Keep
public abstract class UnsupportedFeatureDiagnostic implements Diagnostic {

  public static String makeMessage(
      AndroidApiLevel minApiLevel, String unsupportedFeatures, String sourceString) {
    String message =
        minApiLevel == null
            ? (unsupportedFeatures + " are not supported at any API level known by the compiler")
            : (unsupportedFeatures
                + " are only supported starting with "
                + minApiLevel.getName()
                + " (--min-api "
                + minApiLevel.getLevel()
                + ")");
    message = (sourceString != null) ? message + ": " + sourceString : message;
    return message;
  }

  private final String descriptor;
  private final AndroidApiLevel supportedApiLevel;
  private final Origin origin;
  private final Position position;

  // Package-private constructor.
  UnsupportedFeatureDiagnostic(
      String descriptor, AndroidApiLevel supportedApiLevel, Origin origin, Position position) {
    this.descriptor = descriptor;
    this.supportedApiLevel = supportedApiLevel;
    this.origin = origin;
    this.position = position;
  }

  @Override
  public Origin getOrigin() {
    return origin;
  }

  @Override
  public Position getPosition() {
    return position;
  }

  /**
   * Get a descriptor for the unsupported feature.
   *
   * <p>This descriptor is guaranteed by the compiler to be unique for possible unsupported features
   * and will remain unchanged in future versions of the compiler.
   */
  public String getFeatureDescriptor() {
    return descriptor;
  }

  /**
   * Get the API level at which this feature is supported.
   *
   * @return Supported level or -1 if unsupported at all API levels known to the compiler.
   */
  public int getSupportedApiLevel() {
    return supportedApiLevel == null ? -1 : supportedApiLevel.getLevel();
  }
}
