/*
* Copyright 2017 Hewlett Packard Enterprise Development Company, L.P.
* Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
*/
package com.autonomy.abc.selenium.find.bi;
import com.autonomy.abc.selenium.find.Container;
import com.hp.autonomy.frontend.selenium.element.RangeInput;
import com.hp.autonomy.frontend.selenium.util.ElementUtil;
import org.apache.commons.lang3.math.NumberUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static org.openqa.selenium.By.className;
import static org.openqa.selenium.By.cssSelector;
public class TrendingView {
private static final int TRENDING_VIEW_LOAD_TIMEOUT = 30;
private static final int TRENDING_VIEW_FIELD_DROPDOWN_TIMEOUT = 30;
private static final Pattern FIELD_SELECTOR_TEXT = Pattern.compile("^.* \\((?<count>\\d+)\\)");
private final WebDriver driver;
private final WebElement container;
public TrendingView(final WebDriver driver) {
this.driver = driver;
container = ElementUtil.ancestor(Container.currentTabContents(driver).findElement(By.className("trending-chart")), 2);
}
public boolean trendingChartVisible() {
return !findElements(cssSelector(".trending-chart:not(.hide)")).isEmpty();
}
public boolean isLoading() {
return !container.findElements(cssSelector(".trending-loading:not(.hide)")).isEmpty();
}
public void waitForChartToLoad() {
new WebDriverWait(driver, TRENDING_VIEW_LOAD_TIMEOUT).withMessage("Trending never stopped loading")
.until(ExpectedConditions.presenceOfElementLocated(cssSelector(".trending-loading.hide")));
}
public void waitForNumberOfPointsToChange(final int targetNumber) {
final String firstValue = findElement(cssSelector("svg > g[data-name]")).getAttribute("data-name");
new WebDriverWait(driver, TRENDING_VIEW_LOAD_TIMEOUT).withMessage("Target number of buckets not found")
.until(ExpectedConditions.numberOfElementsToBe(cssSelector("[data-name='" + firstValue + "'] circle"), targetNumber));
}
private void waitForDropdownToOpen() {
new WebDriverWait(driver, TRENDING_VIEW_FIELD_DROPDOWN_TIMEOUT).withMessage("Field selector never opened")
.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(cssSelector(".active-result")));
}
public WebElement trendingChart() {
return findElement(cssSelector(".trending-chart svg"));
}
public WebElement chosenField() {
return findElement(cssSelector(".chosen-single span"));
}
List<WebElement> fields() {
final WebElement dropdown = findElement(cssSelector(".chosen-single"));
dropdown.click();
waitForDropdownToOpen();
return findElements(cssSelector(".active-result"));
}
List<String> fieldsList() {
return fields()
.stream()
.map(WebElement::getText)
.collect(Collectors.toList());
}
public RangeInput slider() {
return new RangeInput(findElement(className("range-input-slider")), driver, 10);
}
WebElement graphArea() {
return findElement(className("graph-area"));
}
public List<WebElement> chartValueGroups() {
return findElements(cssSelector("svg > g[data-name]"));
}
public List<WebElement> pointsForNamedValue(final String valueName) {
return findElements(cssSelector("[data-name='" + valueName + "'] circle"));
}
List<WebElement> yAxisTicks() {
return findElements(cssSelector(".y-axis .tick text"));
}
List<WebElement> xAxisTicks() {
return findElements(cssSelector(".x-axis .tick p"));
}
public List<WebElement> legendValueGroups() {
return findElements(cssSelector(".legend > g"));
}
int getSelectedFieldCount(final WebElement fieldElement) {
final String selectorText = fieldElement.getText();
final Matcher matcher = FIELD_SELECTOR_TEXT.matcher(selectorText);
return matcher.find() ? NumberUtils.toInt(matcher.group("count")) : 0;
}
private WebElement findElement(final By locator) {
return container.findElement(locator);
}
private List<WebElement> findElements(final By locator) {
return container.findElements(locator);
}
}