// Copyright 2017 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.rules.android;

import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.BuiltinProvider;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidDex2OatInfoApi;
import javax.annotation.Nullable;

/**
 * Supplies the pregenerate_oat_files_for_tests attribute of type boolean provided by android_device
 * rule.
 */
@Immutable
public final class AndroidDex2OatInfo extends NativeInfo
    implements AndroidDex2OatInfoApi<Artifact, FilesToRunProvider> {

  public static final BuiltinProvider<AndroidDex2OatInfo> PROVIDER = new Provider();

  /** Provider for {@link AndroidDex2OatInfo} objects. */
  private static class Provider extends BuiltinProvider<AndroidDex2OatInfo>
      implements AndroidDex2OatInfoApi.Provider<Artifact, FilesToRunProvider> {
    public Provider() {
      super(NAME, AndroidDex2OatInfo.class);
    }

    @Override
    public AndroidDex2OatInfo androidDex2OatInfo(
        Boolean enabled,
        Boolean executeDex2OatOnHost,
        Object sandboxForPregeneratingOatFilesForTests,
        Object framework,
        Object dalvikCache,
        Object deviceProps) {
      return new AndroidDex2OatInfo(
          enabled,
          executeDex2OatOnHost,
          sandboxForPregeneratingOatFilesForTests instanceof FilesToRunProvider
              ? (FilesToRunProvider) sandboxForPregeneratingOatFilesForTests
              : null,
          framework instanceof Artifact ? (Artifact) framework : null,
          dalvikCache instanceof Artifact ? (Artifact) dalvikCache : null,
          deviceProps instanceof Artifact ? (Artifact) deviceProps : null);
    }
  }

  private final boolean dex2OatEnabled;
  private final boolean executeDex2OatOnExecPlatform;
  private final FilesToRunProvider sandboxForPregeneratingOatFilesForTests;
  private final Artifact framework;
  private final Artifact dalvikCache;
  private final Artifact deviceProps;

  public AndroidDex2OatInfo(
      boolean dex2OatEnabled,
      boolean executeDex2OatOnHost,
      FilesToRunProvider sandboxForPregeneratingOatFilesForTests,
      Artifact framework,
      Artifact dalvikCache,
      Artifact deviceProps) {
    this.dex2OatEnabled = dex2OatEnabled;
    this.executeDex2OatOnExecPlatform = executeDex2OatOnHost;
    this.sandboxForPregeneratingOatFilesForTests = sandboxForPregeneratingOatFilesForTests;
    this.framework = framework;
    this.dalvikCache = dalvikCache;
    this.deviceProps = deviceProps;
  }

  @Override
  public BuiltinProvider<AndroidDex2OatInfo> getProvider() {
    return PROVIDER;
  }

  /** Returns if the device should run cloud dex2oat. */
  public boolean isDex2OatEnabled() {
    return dex2OatEnabled;
  }

  /** Returns whether dex2oat should be executed on the exec platform. */
  public boolean executeDex2OatOnExecPlatform() {
    return executeDex2OatOnExecPlatform;
  }

  /** Returns the virtual device executable to run dex2oat on the exec platform */
  @Nullable
  public FilesToRunProvider getSandboxForPregeneratingOatFilesForTests() {
    return sandboxForPregeneratingOatFilesForTests;
  }

  @Nullable
  public Artifact getFramework() {
    return framework;
  }

  @Nullable
  public Artifact getDalvikCache() {
    return dalvikCache;
  }

  @Nullable
  public Artifact getDeviceProps() {
    return deviceProps;
  }
}
