package org.javamodularity.moduleplugin.tasks;

import org.gradle.api.Project;
import org.gradle.api.plugins.ApplicationPlugin;
import org.gradle.api.plugins.JavaPlugin;

import java.util.Optional;
import java.util.stream.Stream;

public class MergeClassesTask extends AbstractModulePluginTask {
    public MergeClassesTask(Project project) {
        super(project);
    }

    public void configureMergeClasses() {
        project.afterEvaluate(p -> configureMergeClassesAfterEvaluate());
    }

    public void configureMergeClassesAfterEvaluate() {
        if (!mergeClassesHelper().isMergeRequired()) {
            return;
        }

        var mergeClasses = mergeClassesHelper().createMergeClassesTask();

        mergeClassesHelper().allCompileTaskStream().forEach(task -> {
            mergeClasses.from(task.getDestinationDir());
            mergeClasses.dependsOn(task);
        });
        mergeClasses.into(helper().getMergedDir());

        Stream.of(ApplicationPlugin.TASK_RUN_NAME, JavaPlugin.TEST_TASK_NAME)
                .map(helper()::findTask)
                .flatMap(Optional::stream)
                .forEach(task -> task.dependsOn(mergeClasses));
    }
}