// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.webdriver;


import org.junit.Before;
import org.junit.Rule;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;

import io.v.webdriver.htmlreport.HTMLReportData;
import io.v.webdriver.commonpages.ChromeSignInPage;
import io.v.webdriver.commonpages.ExtensionInstallationPage;
import io.v.webdriver.commonpages.ExtensionOptionPage;

import java.io.File;
import java.io.IOException;

/**
 * The base class for all Vanadium UI tests.
 *
 * @author jingjin@google.com
 */
public class VanadiumUITestBase {
  /**
   * System property name for Chrome driver binary. This will be set from the mvn command line.
   */
  private static final String PROPERTY_CHROME_DRIVER_BIN = "chromeDriverBin";

  /**
   * System property name for html report path relative to Jenkins workspace dir. This will be set
   * from the mvn command line.
   */
  private static final String PROPERTY_HTML_REPORTS_RELATIVE_PATH = "htmlReportsRelativePath";

  /**
   * System property name for the bot username and bot password. These will be set from the mvn command line.
   */
  private static final String PROPERTY_GOOGLE_BOT_USERNAME = "googleBotUsername";
  private static final String PROPERTY_GOOGLE_BOT_PASSWORD = "googleBotPassword";

  /**
   * The base dir to store html reports
   */
  protected final String htmlReportsDir;

  /**
   * A variable to keep track of the current htmlReportData.
   */
  protected HTMLReportData curHTMLReportData;

  /**
   * The username and password of the bot account used to sign in to Google/Chrome.
   */
  protected String botUsername;
  protected String botPassword;

  /**
   * Vanadium extension installation url.
   */
  private static final String URL_EXTENSION = "https://chrome.google.com/webstore/detail/"
      + "vanadium-extension/jcaelnibllfoobpedofhlaobfcoknpap";

  protected ChromeDriverService service;

  protected WebDriver driver;

  public VanadiumUITestBase() {
    htmlReportsDir = createReportsDir();
  }

  /**
   * This "Rule" is used to catch failed test cases so we can act on it.
   */
  @Rule
  public TestFailureWatcher testFailureWatcher = new TestFailureWatcher();

  /**
   * Basic WebDriver and other setup tasks. This will be executed before each test case.
   */
  @Before
  public void setup() throws IOException {
    String chromeDriverBin = System.getProperty(PROPERTY_CHROME_DRIVER_BIN);
    botUsername = System.getProperty(PROPERTY_GOOGLE_BOT_USERNAME);
    botPassword = System.getProperty(PROPERTY_GOOGLE_BOT_PASSWORD);
    System.out.println("ChromeDriver binary: " + chromeDriverBin);
    service = new ChromeDriverService.Builder().usingDriverExecutable(new File(chromeDriverBin))
        .usingAnyFreePort().build();
    service.stop();
    service.start();
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--no-sandbox");
    driver = new ChromeDriver(service, options);
    driver.manage().window().maximize();

    testFailureWatcher.setup(this, driver, service);
  }

  public HTMLReportData getCurrentHTMLReportData() {
    return curHTMLReportData;
  }

  private String createReportsDir() {
    String workspaceRoot = System.getenv("WORKSPACE");
    if (workspaceRoot == null) {
      workspaceRoot = System.getenv("HOME");
    }
    if (workspaceRoot == null) {
      return "";
    }
    String reportsDir = String.format("%s/%s", workspaceRoot,
        System.getProperty(PROPERTY_HTML_REPORTS_RELATIVE_PATH, "htmlReports"));
    File reportsFile = new File(reportsDir);
    if (!reportsFile.exists()) {
      if (reportsFile.mkdirs()) {
        System.out.println(String.format("Reports dir '%s' creatred", reportsDir));
      } else {
        throw new RuntimeException(String.format("Failed to create reports dir '%s'", reportsDir));
      }
    }
    return reportsDir;
  }

  /**
   * UI tests will commonly need to install the extension.
   * The process involves signing into Chrome, installing the extension, and
   * verifying that it was installed successfully.
   */
  protected void installExtension(HTMLReportData reportData) throws Exception {
    // Sign into Chrome.
    ChromeSignInPage chromeSignInPage = new ChromeSignInPage(driver, reportData);
    chromeSignInPage.go();
    chromeSignInPage.signIn(botUsername, botPassword);

    // Install Vanadium extension.
    ExtensionInstallationPage extensionInstallationPage =
        new ExtensionInstallationPage(driver, URL_EXTENSION, reportData);
    extensionInstallationPage.go();
    extensionInstallationPage.login(botPassword);
    extensionInstallationPage.install();

    // Check Vanadium extension option page.
    ExtensionOptionPage extensionOptionPage = new ExtensionOptionPage(driver, reportData);
    extensionOptionPage.go();
  }
}
