package shop;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestWatcher;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Optional;

/** Starts headless Chromium for one test, and appends one result line per test run to a CSV. */
public final class BrowserSupport {

    private BrowserSupport() {}

    static String version() {
        return System.getProperty("ui.version", "v1");
    }

    static WebDriver newDriver() {
        ChromeOptions o = new ChromeOptions();
        o.setBinary(System.getProperty("chrome.binary"));
        o.addArguments("--headless=new", "--no-sandbox", "--disable-gpu", "--disable-dev-shm-usage",
                "--window-size=1100,800");
        return new ChromeDriver(o);
    }

    /** Writes: version,suite,test,PASS|FAIL,first line of the failure. */
    public static final class ResultLog implements TestWatcher {
        public ResultLog() { }

        private void write(ExtensionContext ctx, String outcome, String why) {
            String line = String.join(",", version(), ctx.getRequiredTestClass().getSimpleName(), ctx.getRequiredTestMethod().getName(), outcome,
                    why.replace(',', ';').replace('\n', ' ')) + "\n";
            try {
                Files.writeString(Path.of(System.getProperty("results.file")), line,
                        StandardOpenOption.CREATE, StandardOpenOption.APPEND);
            } catch (IOException e) {
                throw new IllegalStateException(e);
            }
        }

        @Override public void testSuccessful(ExtensionContext ctx) { write(ctx, "PASS", ""); }

        @Override
        public void testFailed(ExtensionContext ctx, Throwable cause) {
            String m = String.valueOf(cause.getMessage()).split("\n")[0];
            write(ctx, "FAIL", cause.getClass().getSimpleName() + ": " + m);
        }

        @Override public void testAborted(ExtensionContext ctx, Throwable cause) { write(ctx, "ABORT", ""); }

        @Override public void testDisabled(ExtensionContext ctx, Optional<String> reason) { }
    }
}
