package org.implab.gradle.variants.artifacts.internal;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.gradle.api.Action;
import org.implab.gradle.variants.artifacts.ArtifactAssemblies;
import org.implab.gradle.variants.artifacts.ArtifactSlot;
import org.implab.gradle.variants.artifacts.OutgoingVariant;

/**
 * Связывает описание исходящих конфигураций gradle и сборку содержимого слотов
 * из {@link ArtifactAssemblies}
 */
@NonNullByDefault
public class ArtifactAssemblyBinder implements Action<OutgoingVariant> {

    private final ArtifactAssemblies resolver;

    public ArtifactAssemblyBinder(ArtifactAssemblies resolver) {
        this.resolver = resolver;
    }

    @Override
    public void execute(OutgoingVariant outgoingVariant) {
        var slots = outgoingVariant.getSlots();
        var primarySlotProvider = outgoingVariant.getPrimarySlot();
        var variant = outgoingVariant.getVariant();

        // связываем конфигурацию
        outgoingVariant.configureOutgoing(configuration -> {
            var primarySlot = primarySlotProvider.get();
            var outgoing = configuration.getOutgoing();

            // связываем основной вариант конфигурации
            resolver.when(
                    new ArtifactSlot(variant, primarySlot),
                    assembly -> outgoing.artifact(assembly.getArtifact()));

            // для всех объявленных слотов
            slots.all(slot -> {
                // кроме основного
                if (slot.equals(primarySlot))
                    return;

                // связываем артефакты
                resolver.when(
                        new ArtifactSlot(variant, slot),
                        assembly -> outgoing.getVariants()
                                .register(slot.getName())
                                .configure(cv -> cv.artifact(assembly.getArtifact())));
            });
        });
    }



}
