/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * 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.android.build.gradle.internal.scope;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.build.api.component.impl.ComponentPropertiesImpl;
import com.android.build.gradle.internal.PostprocessingFeatures;
import com.android.build.gradle.internal.core.Abi;
import com.android.build.gradle.internal.core.VariantDslInfo;
import com.android.build.gradle.internal.core.VariantSources;
import com.android.build.gradle.internal.dependency.VariantDependencies;
import com.android.build.gradle.internal.packaging.JarCreatorType;
import com.android.build.gradle.internal.pipeline.TransformManager;
import com.android.build.gradle.internal.publishing.AndroidArtifacts;
import com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactType;
import com.android.build.gradle.internal.publishing.PublishingSpecs;
import com.android.build.gradle.internal.variant.VariantPathHelper;
import com.android.builder.core.VariantType;
import com.android.builder.dexing.DexMergerTool;
import com.android.builder.dexing.DexerTool;
import com.android.builder.dexing.DexingType;
import com.android.builder.internal.packaging.ApkCreatorType;
import com.android.builder.model.CodeShrinker;
import com.android.sdklib.AndroidVersion;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.Directory;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.RegularFile;
import org.gradle.api.provider.Provider;

/** A scope containing data for a specific variant. */
public interface VariantScope {

    @NonNull
    PublishingSpecs.VariantSpec getPublishingSpec();

    void publishIntermediateArtifact(
            @NonNull Provider<?> artifact,
            @NonNull ArtifactType artifactType,
            @NonNull Collection<AndroidArtifacts.PublishedConfigType> configTypes);

    @Nullable
    CodeShrinker getCodeShrinker();

    @NonNull
    List<File> getProguardFiles();

    @NonNull
    BuildArtifactsHolder getArtifacts();

    @NonNull
    VariantDslInfo getVariantDslInfo();

    @NonNull
    VariantSources getVariantSources();

    @NonNull
    VariantPathHelper getPaths();

    @NonNull
    VariantDependencies getVariantDependencies();

    /** @deprecated Use {@link ComponentPropertiesImpl#getGlobalScope()} */
    @Deprecated
    @NonNull
    GlobalScope getGlobalScope();

    /**
     * Returns the proguardFiles explicitly specified in the build.gradle. This method differs from
     * getProguardFiles() because getProguardFiles() may include a default proguard file which
     * wasn't specified in the build.gradle file.
     */
    @NonNull
    List<File> getExplicitProguardFiles();

    @NonNull
    List<File> getTestProguardFiles();

    @NonNull
    List<File> getConsumerProguardFiles();

    @NonNull
    List<File> getConsumerProguardFilesForFeatures();

    @Nullable
    PostprocessingFeatures getPostprocessingFeatures();

    boolean useResourceShrinker();

    boolean isPrecompileDependenciesResourcesEnabled();

    boolean isCrunchPngs();

    boolean consumesFeatureJars();

    /** Returns whether we need to create original java resource streams */
    boolean getNeedsJavaResStreams();

    /** Returns whether we need to create a stream from the merged java resources */
    boolean getNeedsMergedJavaResStream();

    boolean getNeedsMainDexListForBundle();

    boolean isTestOnly();

    boolean isCoreLibraryDesugaringEnabled();

    /** Returns if we need to shrink desugar_jdk_libs when desugaring Core Library. */
    boolean getNeedsShrinkDesugarLibrary();

    @NonNull
    DexingType getDexingType();

    boolean getNeedsMainDexList();

    @NonNull
    AndroidVersion getMinSdkVersion();

    @NonNull
    TransformManager getTransformManager();

    void addNdkDebuggableLibraryFolders(@NonNull Abi abi, @NonNull File searchPath);

    /** Returns the path(s) to compiled R classes (R.jar). */
    @NonNull
    FileCollection getCompiledRClasses(@NonNull AndroidArtifacts.ConsumedConfigType configType);

    @NonNull
    FileCollection getLocalPackagedJars();

    /**
     * Returns the direct (i.e., non-transitive) local file dependencies matching the given
     * predicate
     *
     * @return a non null, but possibly empty FileCollection
     * @param filePredicate the file predicate used to filter the local file dependencies
     */
    @NonNull
    FileCollection getLocalFileDependencies(Predicate<File> filePredicate);

    @NonNull
    FileCollection getProvidedOnlyClasspath();

    @NonNull
    Provider<RegularFile> getRJarForUnitTests();

    enum Java8LangSupport {
        INVALID,
        UNUSED,
        D8,
        DESUGAR,
        RETROLAMBDA,
        R8,
    }

    @NonNull
    Java8LangSupport getJava8LangSupportType();

    @NonNull
    DexerTool getDexer();

    @NonNull
    DexMergerTool getDexMerger();

    @NonNull
    ConfigurableFileCollection getTryWithResourceRuntimeSupportJar();

    @NonNull
    FileCollection getBootClasspath();

    @NonNull
    InternalArtifactType<Directory> getManifestArtifactType();

    @NonNull
    JarCreatorType getJarCreatorType();

    @NonNull
    ApkCreatorType getApkCreatorType();

    /**
     * Returns a {@link Provider} for the name of the feature.
     *
     * @return the provider
     */
    @NonNull
    Provider<String> getFeatureName();

    @NonNull
    Provider<Integer> getResOffset();
}
