package org.implab.gradle.variants.artifacts;

import org.gradle.api.Action;
import org.gradle.api.NamedDomainObjectContainer;
import org.gradle.api.NamedDomainObjectProvider;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.provider.Property;
import org.implab.gradle.variants.core.Variant;

/**
 * Описывает исходящую конфигурацию варианта
 *
 * Задает связь между моделью вариантов и моделью конфигураций gradle через
 * свойство {@link #getConfiguration()}. Также задает отдельную ось слотов
 * публикации, но не задает правил связывания этих слотов с самой конфигурацией
 * и их содержимым. Самый простой вариант это {@link ArtifactAssemblies}.
 */
public interface OutgoingVariant {
    /**
     * Исходный вариант для которого строится Outgoing конфигурация
     */
    Variant getVariant();

    /**
     * Провайдер зарегистрированной конфигурации
     */
    NamedDomainObjectProvider<Configuration> getConfiguration();

    default void configure(Action<? super Configuration> action) {
        getConfiguration().configure(action);
    }

    /**
     * Слоты конфигурации, данная коллекция живая, используется для
     * получения информации об объявленных слотах, но эти слоты не
     * обязаны быть сконфигурированы, т.е. это только Identity.
     *
     * @see {@link ArtifactSlot}
     */
    NamedDomainObjectContainer<Slot> getSlots();

    /**
     * Основной набор артефактов (primary variant) для исходящей конфигурации
     *
     * <p>
     * Если в свойстве {@link #getSlots()} есть только один слой, то по конвенции он
     * считается также основным.
     */
    Property<Slot> getPrimarySlot();
}
