/*
* Copyright 2016 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.filters;
import com.autonomy.abc.selenium.find.Container;
import com.autonomy.abc.selenium.indexes.Index;
import com.autonomy.abc.selenium.indexes.tree.IndexCategoryNode;
import com.autonomy.abc.selenium.indexes.tree.IndexesTree;
import com.autonomy.abc.selenium.query.DatePickerFilter;
import com.autonomy.abc.selenium.query.StringDateFilter.Filterable;
import com.hp.autonomy.frontend.selenium.element.Collapsible;
import com.hp.autonomy.frontend.selenium.util.ElementUtil;
import com.hp.autonomy.frontend.selenium.util.ParametrizedFactory;
import org.apache.commons.lang3.text.WordUtils;
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.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import static com.hp.autonomy.frontend.selenium.util.CssUtil.cssifyIndex;
public class FilterPanel {
private final WebElement panel;
private final WebDriver driver;
private final ParametrizedFactory<IndexCategoryNode, IndexesTree> indexesTreeFactory;
public FilterPanel(final ParametrizedFactory<IndexCategoryNode, IndexesTree> indexesTreeFactory, final WebDriver driver) {
this.indexesTreeFactory = indexesTreeFactory;
this.driver = driver;
panel = Container.LEFT.findUsing(driver).findElement(By.cssSelector(".left-side-filters-view-section"));
}
//INDEX/DATABASE RELATED
public IndexesTree indexesTree() {
return indexesTreeFactory.create(new FindIndexCategoryNode(panel.findElement(By.cssSelector(".databases-list [data-category-id='all']")), driver));
}
public Index getIndex(final int i) {
indexesTreeContainer().expand();
return indexesTree().allIndexes().getIndex(i);
}
public void waitForIndexes() {
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.className("not-loading")));
}
public IndexesTreeContainer indexesTreeContainer() {
final WebElement container = panel.findElement(By.xpath(".//div[contains(div/@class, 'collapsible-header') and (contains(div/h4/span/text(), 'Indexes') or contains(div/h4/span/text(), 'Databases'))]"));
return new IndexesTreeContainer(container, driver);
}
public DateFilterContainer dateFilterContainer() {
final WebElement container = panel.findElement(By.xpath(".//div[contains(div/@class, 'collapsible-header') and contains(div/h4/span/text(), 'Dates')]"));
return new DateFilterContainer(container, driver);
}
public List<ParametricFieldContainer> parametricFieldContainers() {
final List<ParametricFieldContainer> containers = new ArrayList<>();
for(final WebElement container : getParametricFilters()) {
containers.add(new ParametricFieldContainer(container, driver));
}
return containers;
}
private Iterable<WebElement> getParametricFilters() {
return panel.findElements(By.cssSelector("[data-field-display-name][data-field]"));
}
public ParametricFieldContainer parametricContainerOfFilter(final String filter) {
final WebElement field = panel.findElement(By.cssSelector(".parametric-value-element[data-value='" + filter + "']"));
return new ParametricFieldContainer(ElementUtil.ancestor(field, 5), driver);
}
public ParametricFieldContainer parametricContainer(final String filterCategory) {
final WebElement category = panel.findElement(By.cssSelector("[data-field-display-name='" + filterCategory + "']"));
return new ParametricFieldContainer(category, driver);
}
public boolean parametricContainerIsPresent(final String filterCategory) {
return !panel.findElements(By.cssSelector("[data-field-display-name='" + filterCategory + "']")).isEmpty();
}
public ParametricFieldContainer parametricField(final int i) {
return parametricFieldContainers().get(i);
}
public int nonZeroParamFieldContainer(final int n) {
return nthParametricThatSatisfiedCondition(n, x -> 0 != x);
}
public int nthParametricThatSatisfiedCondition(final int n, final Predicate<Integer> op) {
int index = 0;
int nonZeroCount = 0;
for(final WebElement container : getParametricFilters()) {
final ParametricFieldContainer candidate = new ParametricFieldContainer(container, driver);
if(op.test(candidate.getFilterCount())) {
if(nonZeroCount >= n) {
return index;
} else {
nonZeroCount++;
}
}
index++;
}
return -1;
}
public String formattedNameOfNonZeroField(final int n) {
return WordUtils.capitalize(parametricField(nonZeroParamFieldContainer(n))
.filterCategoryName()
.toLowerCase());
}
//DATE SPECIFIC
public void toggleFilter(final DateOption filter) {
dateFilterContainer().toggleFilter(filter);
}
public DatePickerFilter.Filterable datePickerFilterable() {
return dateFilterContainer();
}
public Filterable stringDateFilterable() {
return dateFilterContainer();
}
//CHECKBOXES
public List<FindParametricFilter> checkBoxesForParametricFieldContainer(final int i) {
final int index = nonZeroParamFieldContainer(i);
final ParametricFieldContainer container = parametricField(index);
container.expand();
return container.getFilters();
}
public FindParametricFilter checkboxForParametricValue(final String fieldName, final String fieldValue) {
final ParametricFieldContainer container = new ParametricFieldContainer(panel.findElement(By.cssSelector("[data-field-display-name='" + fieldName + "']")), driver);
container.expand();
return new FindParametricFilter(container.getContainer().findElement(By.cssSelector("[data-value='" + fieldValue.toUpperCase() + "']")));
}
public FindParametricFilter checkboxForParametricValue(final int fieldIndex, final int valueIndex) {
final ParametricFieldContainer container = new ParametricFieldContainer(panel.findElements(By.cssSelector("[data-field]")).get(fieldIndex), driver);
container.expand();
return new FindParametricFilter(container.getContainer().findElement(By.cssSelector("[data-value]:nth-of-type(" + cssifyIndex(valueIndex) + ')')));
}
//EXPANDING AND COLLAPSING
public List<FilterContainer> allFilterContainers() {
final List<FilterContainer> nodes = new ArrayList<>();
nodes.add(indexesTreeContainer());
nodes.add(dateFilterContainer());
nodes.addAll(parametricFieldContainers());
return nodes;
}
public void collapseAll() {
allFilterContainers().forEach(Collapsible::collapse);
}
//OTHER
public String getErrorMessage() {
return panel.findElement(By.cssSelector("p:not(.hide)")).getText();
}
public void waitForParametricFields() {
Container.LEFT.waitForLoad(driver);
}
protected WebElement getPanel() {
return panel;
}
public List<WebElement> toolTips() {
return panel.findElements(By.cssSelector("[aria-describedby^='tooltip']"));
}
public boolean containerContainsFilter(final String target, final int index) {
final int tooManyFiltersToBother = 600;
final ParametricFieldContainer container = parametricField(index);
if(container.getFilterCount() > tooManyFiltersToBother) {
return true;
}
container.expand();
container.seeAll();
final ParametricFilterModal filterModal = ParametricFilterModal.getParametricModal(driver);
final List<WebElement> filters = filterModal.activePaneFilterList();
for(final WebElement filter : filters) {
final String name = filter.findElement(By.cssSelector(".field-value")).getText();
if(name.contains(target)) {
filterModal.cancel();
return true;
}
}
filterModal.cancel();
return false;
}
}