package org.implab.gradle.variants.artifacts;

import java.util.Optional;

import org.gradle.api.Action;
import org.gradle.api.InvalidUserDataException;
import org.implab.gradle.variants.core.Variant;
import org.implab.gradle.variants.core.VariantsView;

/**
 * Контекст работы с вариантами публикации, становится доступным после
 * финализации модели вариантов. Фактически является живой моделью
 */
public interface OutgoingVariantsContext {

    /**
     * Зафиксированное представление о вариантах на основе которого адаптеры могут
     * конфигурировать артефакты и исходящие конфигурации
     */
    VariantsView getVariants();

    ArtifactAssemblies getAssemblies();

    /**
     * Replayable hook для всех объявленных конфигураций
     */
    void all(Action<? super OutgoingVariant> action);

    Optional<OutgoingVariant> findOutgoing(Variant variant);

    default OutgoingVariant requireOutgoing(Variant variant) {
        return findOutgoing(variant)
                .orElseThrow(() -> new InvalidUserDataException("Outgoing variant '" + variant + "' isn't registered"));
    }

    ArtifactAssemblyRules slotRules(ArtifactSlot slot);

}
