package org.jboss.windup.addon.ui;

import java.io.File;
import java.lang.reflect.InvocationTargetException;

import javax.inject.Inject;

import org.apache.commons.io.FileUtils;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.arquillian.AddonDependencies;
import org.jboss.forge.arquillian.AddonDependency;
import org.jboss.forge.arquillian.archive.AddonArchive;
import org.jboss.forge.furnace.util.OperatingSystemUtils;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.windup.exec.updater.RulesetsUpdater;
import org.jboss.windup.util.PathUtil;
import org.jboss.windup.util.ZipUtil;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
@Ignore("Updating of rules is disabled temporary, so this test doesn't make sense to test")
public class WindupUpdateRulesetTest {
    @Deployment
    @AddonDependencies({
            @AddonDependency(name = "org.jboss.forge.furnace.container:cdi"),
            @AddonDependency(name = "org.jboss.windup.utils:windup-utils"),
            @AddonDependency(name = "org.jboss.windup.exec:windup-exec"),
            @AddonDependency(name = "org.jboss.windup.graph:windup-graph"),
            @AddonDependency(name = "org.jboss.windup.ui:windup-ui"),
            @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java"),
            @AddonDependency(name = "org.jboss.forge.addon:maven"),
    })
    public static AddonArchive getDeployment() {
        AddonArchive archive = ShrinkWrap
                .create(AddonArchive.class)
                .addBeansXML()
                .addAsResource(WindupUpdateRulesetTest.class.getResource(TEST_OLD_WINDUP), TEST_OLD_WINDUP);
        return archive;
    }

    private static String TEST_OLD_WINDUP = "/windup-old-ruleset.zip";

    @Inject
    private RulesetsUpdater updater;

    @Test
    public void testUpdateRuleset() throws Exception {
        // Extract the rulesets to a temp dir and move the rules/ to target/rules/ .
        File tempDir = OperatingSystemUtils.createTempDir();

        ZipUtil.unzipFromClassResource(WindupUpdateRulesetTest.class, TEST_OLD_WINDUP, tempDir);
        final File targetDir = PathUtil.getWindupHome().resolve("target").toAbsolutePath().toFile();
        final File rulesetsDir = new File(targetDir, "rules");
        FileUtils.deleteDirectory(rulesetsDir);
        FileUtils.moveDirectoryToDirectory(new File(tempDir, "windup-old-ruleset/rules"), targetDir, false);
        System.setProperty(PathUtil.WINDUP_RULESETS_DIR_SYSPROP, rulesetsDir.getAbsolutePath());
        FileUtils.deleteDirectory(tempDir);

        try {
            boolean rulesetNeedUpdate = this.updater.rulesetsNeedUpdate(true);
            Assert.assertTrue("Rulesets should need an update.", rulesetNeedUpdate);
            updater.replaceRulesetsDirectoryWithLatestReleaseIfAny();
            Assert.assertFalse("Rulesets should not need an update.", this.updater.rulesetsNeedUpdate(true));
        } catch (Throwable ex) {
            if (ex.getClass().getSimpleName().equals("InvocationTargetException")) {
                final Throwable wrappedEx = ((InvocationTargetException) ex).getTargetException();
                throw new RuntimeException(wrappedEx.getClass().getSimpleName() + " " + wrappedEx.getMessage(), wrappedEx);
            } else
                throw ex;
        } finally {
            System.getProperties().remove("windup.home");
        }
    }

}