package io.pivotal.services.plugin.tasks;

import io.pivotal.services.plugin.CfProperties;
import io.pivotal.services.plugin.tasks.helper.CfCreateServiceHelper;
import io.pivotal.services.plugin.tasks.helper.CfCreateUserProvidedServiceHelper;
import org.cloudfoundry.operations.CloudFoundryOperations;
import org.cloudfoundry.operations.applications.ApplicationDetail;
import org.gradle.api.tasks.TaskAction;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Responsible for creating the list of services
 *
 * @author Biju Kunjummen
 */
public class CfCreateServicesTask extends AbstractCfTask {

    private CfCreateServiceHelper createServiceHelper = new CfCreateServiceHelper();
    private CfCreateUserProvidedServiceHelper userProvidedServiceHelper = new CfCreateUserProvidedServiceHelper();

    @TaskAction
    public void cfCreateServiceTask() {

        CloudFoundryOperations cfOperations = getCfOperations();
        CfProperties cfProperties = getCfProperties();

        List<Mono<Void>> createServicesResult = cfProperties.cfServices()
            .stream()
            .map(service -> createServiceHelper.createService(cfOperations, service).then())
            .collect(Collectors.toList());

        List<Mono<Void>> createUserProvidedServicesResult = cfProperties.cfUserProvidedServices()
            .stream()
            .map(service -> userProvidedServiceHelper.createUserProvidedService(cfOperations, service))
            .collect(Collectors.toList());

        Flux.merge(createServicesResult).toIterable().forEach(r -> {
        });
        Flux.merge(createUserProvidedServicesResult).toIterable().forEach(r -> {
        });
    }

    @Override
    public String getDescription() {
        return "Create a set of services";
    }
}