package io.fluentlenium.core.filter;

import io.fluentlenium.core.filter.matcher.ContainsMatcher;
import io.fluentlenium.core.filter.matcher.ContainsWordMatcher;
import io.fluentlenium.core.filter.matcher.EndsWithMatcher;
import io.fluentlenium.core.filter.matcher.EqualMatcher;
import io.fluentlenium.core.filter.matcher.NotContainsMatcher;
import io.fluentlenium.core.filter.matcher.NotEndsWithMatcher;
import io.fluentlenium.core.filter.matcher.NotStartsWithMatcher;
import io.fluentlenium.core.filter.matcher.StartsWithMatcher;

import java.util.regex.Pattern;

/**
 * Builder for search filters
 */
public class FilterBuilder {

    private final String attribute;

    /**
     * Creates a new filter builder, using custom attributes.
     *
     * @param customAttribute custom attributes to use for filters created by this builder
     */
    public FilterBuilder(String customAttribute) {
        attribute = customAttribute;
    }

    /**
     * Builds a filter that match when selection is equal to a given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter equalTo(String value) {
        return new AttributeFilter(attribute, new EqualMatcher(value));
    }

    /**
     * Builds a filter that match when selection contains to a given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter contains(String value) {
        return new AttributeFilter(attribute, new ContainsMatcher(value));
    }

    /**
     * Builds a filter that match when selection contains a given word.
     *
     * @param word value to search
     * @return new filter
     */
    public AttributeFilter containsWord(String word) {
        return new AttributeFilter(attribute, new ContainsWordMatcher(word));
    }

    /**
     * Builds a filter that match when selection contains to a given pattern.
     *
     * @param pattern pattern to match
     * @return new filter
     */
    public AttributeFilter contains(Pattern pattern) {
        return new AttributeFilter(attribute, new ContainsMatcher(pattern));
    }

    /**
     * Builds a filter that match when selection starts with to a given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter startsWith(String value) {
        return new AttributeFilter(attribute, new StartsWithMatcher(value));
    }

    /**
     * Builds a filter that match when selection starts with to a given pattern.
     *
     * @param pattern pattern to match
     * @return new filter
     */
    public AttributeFilter startsWith(Pattern pattern) {
        return new AttributeFilter(attribute, new StartsWithMatcher(pattern));
    }

    /**
     * Builds a filter that match when selection ends with to a given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter endsWith(String value) {
        return new AttributeFilter(attribute, new EndsWithMatcher(value));
    }

    /**
     * Builds a filter that match when selection ends with to a given pattern.
     *
     * @param pattern pattern to match
     * @return new filter
     */
    public AttributeFilter endsWith(Pattern pattern) {
        return new AttributeFilter(attribute, new EndsWithMatcher(pattern));
    }

    /**
     * Builds a filter that match when selection doesn't contain given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter notContains(String value) {
        return new AttributeFilter(attribute, new NotContainsMatcher(value));
    }

    /**
     * Builds a filter that match when selection doesn't contain given pattern.
     *
     * @param pattern pattern to match
     * @return new filter
     */
    public AttributeFilter notContains(Pattern pattern) {
        return new AttributeFilter(attribute, new NotContainsMatcher(pattern));
    }

    /**
     * Builds a filter that match when selection doesn't start with given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter notStartsWith(String value) {
        return new AttributeFilter(attribute, new NotStartsWithMatcher(value));
    }

    /**
     * Builds a filter that match when selection doesn't start with given pattern.
     *
     * @param pattern pattern to match
     * @return new filter
     */
    public AttributeFilter notStartsWith(Pattern pattern) {
        return new AttributeFilter(attribute, new NotStartsWithMatcher(pattern));
    }

    /**
     * Builds a filter that match when selection doesn't end with given value.
     *
     * @param value value to search
     * @return new filter
     */
    public AttributeFilter notEndsWith(String value) {
        return new AttributeFilter(attribute, new NotEndsWithMatcher(value));
    }

    /**
     * Builds a filter that match when selection doesn't end with given pattern.
     *
     * @param pattern pattern to match
     * @return new filter
     */
    public AttributeFilter notEndsWith(Pattern pattern) {
        return new AttributeFilter(attribute, new NotEndsWithMatcher(pattern));
    }

}
