package org.kravemir.gradle.sass.tests;

import org.apache.commons.io.FileUtils;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.regex.Pattern;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
 * @author Miroslav Kravec
 */
public class HelloSassExampleTest {

    @Rule
    public final TemporaryFolder testProjectDir = new TemporaryFolder();

    private void sed(File file, Pattern regex, String value) throws IOException {
        String contents = FileUtils.readFileToString(file, StandardCharsets.UTF_8.name());
        contents = regex.matcher(contents).replaceAll(value);
        FileUtils.write(file, contents);
    }

    private void removePluginVersion(File file) throws IOException {
        sed(
                file,
                Pattern.compile("id 'org\\.kravemir\\.gradle\\.sass\\' version .*"),
                "id 'org.kravemir.gradle.sass'"
        );

    }

    @Before
    public void setup() throws IOException {
        // copy 01-HelloSass example
        FileUtils.copyDirectory(Paths.get("..","examples","01-HelloSass").toFile(), testProjectDir.getRoot());
        File buildDirectory = new File(testProjectDir.getRoot(), "build");
        if(buildDirectory.exists())
            FileUtils.deleteDirectory(buildDirectory);

        removePluginVersion(new File(testProjectDir.getRoot(), "build.gradle"));
    }

    @Test
    public void checkBuiltFiles() {
        BuildResult result = GradleRunner.create()
                .withProjectDir(testProjectDir.getRoot())
                .withArguments("mainSass")
                .withPluginClasspath()
                .build();

        assertEquals("check that ':mainSass' task succeeded", result.task(":mainSass").getOutcome(),TaskOutcome.SUCCESS);

        Path mainSassBuildRoot = Paths.get(testProjectDir.getRoot().getPath(), "build", "sass", "main");
        assertTrue(mainSassBuildRoot.resolve(Paths.get("main.css")).toFile().exists());
        assertTrue(mainSassBuildRoot.resolve(Paths.get("relPath","foo.css")).toFile().exists());
    }

}