package org.jboss.windup.config.parser.metadata;

import static org.joox.JOOX.$;

import java.util.List;

import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.windup.config.exception.ConfigurationException;
import org.jboss.windup.config.metadata.MetadataBuilder;
import org.jboss.windup.config.metadata.RulesetMetadata;
import org.jboss.windup.config.metadata.TechnologyReference;
import org.jboss.windup.config.parser.ElementHandler;
import org.jboss.windup.config.parser.NamespaceElementHandler;
import org.jboss.windup.config.parser.ParserContext;
import org.jboss.windup.config.parser.xml.RuleProviderHandler;
import org.w3c.dom.Element;

@NamespaceElementHandler(elementName = "metadata", namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE)
public class MetadataRootHandler implements ElementHandler<RulesetMetadata> {

    public static final String DEPENDENCIES = "dependencies";
    public static final String SOURCE_TECHNOLOGY = "sourceTechnology";
    public static final String TARGET_TECHNOLOGY = "targetTechnology";
    public static final String TAG = "tag";
    public static final String EXECUTE_AFTER = "executeAfter";
    public static final String EXECUTE_BEFORE = "executeBefore";

    @Override
    @SuppressWarnings("unchecked")
    public RulesetMetadata processElement(ParserContext context, Element element) throws ConfigurationException {
        List<Element> children = $(element).children().get();
        MetadataBuilder metadataBuilder = context.getBuilder().getMetadataBuilder();
        for (Element child : children) {
            Object result = context.processElement(child);

            switch ($(child).tag()) {
                case MetadataProviderOverrideHandler.OVERRIDE_PROVIDER:
                    metadataBuilder.setOverrideProvider((Boolean) result);
                    break;

                case MetadataDescriptionHandler.DESCRIPTION:
                    metadataBuilder.setDescription((String) result);
                    break;

                case DEPENDENCIES:
                    for (AddonId id : (List<AddonId>) result) {
                        metadataBuilder.addRequiredAddon(id);
                    }
                    break;

                case SOURCE_TECHNOLOGY:
                    metadataBuilder.addSourceTechnology((TechnologyReference) result);
                    break;

                case TARGET_TECHNOLOGY:
                    metadataBuilder.addTargetTechnology((TechnologyReference) result);
                    break;

                case TAG:
                    metadataBuilder.addTag((String) result);
                    break;

                case EXECUTE_AFTER:
                    metadataBuilder.addExecuteAfterId((String) result);
                    break;

                case EXECUTE_BEFORE:
                    metadataBuilder.addExecuteBeforeId((String) result);
                    break;
            }
        }
        return metadataBuilder;
    }

}
