package org.jboss.forge.addon.thorntail.ui;

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

import org.jboss.forge.addon.facets.constraints.FacetConstraint;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.Projects;
import org.jboss.forge.addon.thorntail.facet.ThorntailFacet;
import org.jboss.forge.addon.ui.context.UIBuilder;
import org.jboss.forge.addon.ui.context.UIContext;
import org.jboss.forge.addon.ui.context.UIExecutionContext;
import org.jboss.forge.addon.ui.input.InputComponentFactory;
import org.jboss.forge.addon.ui.input.UISelectMany;
import org.jboss.forge.addon.ui.metadata.UICommandMetadata;
import org.jboss.forge.addon.ui.result.Result;
import org.jboss.forge.addon.ui.result.Results;
import org.jboss.forge.addon.ui.util.Metadata;
import org.jboss.forge.furnace.util.Lists;
import org.wildfly.swarm.fractions.FractionDescriptor;

@FacetConstraint(ThorntailFacet.class)
public class AddFractionCommand extends AbstractThorntailCommand
{
    private UISelectMany<FractionDescriptor> fractionElements;

    @Override
    public UICommandMetadata getMetadata(UIContext context)
    {
        return Metadata.from(super.getMetadata(context), getClass()).name("Thorntail: Add Fraction")
                    .description("Add one or more fractions. Installed fractions have been filtered out.");
    }

    @Override
    public void initializeUI(UIBuilder builder) throws Exception
    {
        InputComponentFactory factory = builder.getInputComponentFactory();
        fractionElements = factory.createSelectMany("fractions", FractionDescriptor.class)
                    .setLabel("Fraction List")
                    .setDescription("Fraction list");

        UIContext uiContext = builder.getUIContext();
        if (uiContext.getProvider().isGUI())
        {
            fractionElements.setItemLabelConverter(FractionDescriptor::getName);
        }
        else
        {
            fractionElements.setItemLabelConverter(FractionDescriptor::getArtifactId);
        }
        Project project = Projects.getSelectedProject(getProjectFactory(), uiContext);
        final Collection<FractionDescriptor> fractions;
        if (project != null && project.hasFacet(ThorntailFacet.class))
        {
            fractions = project.getFacet(ThorntailFacet.class).getFractions();
        }
        else
        {
            fractions = ThorntailFacet.getAllFractionDescriptors();
        }
        final List<FractionDescriptor> nonInternalfractions = fractions.stream()
                    .filter(f -> !f.isInternal())
                    .collect(Collectors.toList());
        fractionElements.setValueChoices(nonInternalfractions);

        builder.add(fractionElements);
    }

    @Override
    public Result execute(UIExecutionContext context) throws Exception
    {
        Project project = getSelectedProject(context);
        ThorntailFacet facet = project.getFacet(ThorntailFacet.class);
        if (fractionElements.hasValue())
        {
            List<FractionDescriptor> fractions = Lists.toList(fractionElements.getValue());
            facet.installFractions(fractions);
            List<String> artifactIds = fractions.stream().map(FractionDescriptor::getArtifactId)
                        .collect(Collectors.toList());
            return Results.success("Thorntail Fractions '"
                        + artifactIds
                        + "' were successfully added to the project descriptor");
        }
        return Results.success();
    }

    /**
     * @return the fractionElements
     */
    public UISelectMany<FractionDescriptor> getFractionElements()
    {
        return fractionElements;
    }
}