package io.fluentlenium.core.conditions;

import io.fluentlenium.core.domain.FluentWebElement;
import org.openqa.selenium.Rectangle;

import java.util.function.Function;

/**
 * Conditions for list of rectangles.
 */
public class RectangleListConditionsImpl extends BaseObjectListConditions<Rectangle, RectangleConditions>
        implements RectangleConditions {

    /**
     * Creates a new list of rectangles conditions
     *
     * @param conditions       rectangles conditions
     * @param objectGetter     getter of the underlying rectangle
     * @param conditionsGetter getter of the underlying rectangle conditions
     */
    public RectangleListConditionsImpl(Conditions<FluentWebElement> conditions,
                                       Function<FluentWebElement, Rectangle> objectGetter,
                                       Function<FluentWebElement, RectangleConditions> conditionsGetter) {
        super(conditions, objectGetter, conditionsGetter);
    }

    /**
     * Creates a new list of rectangles conditions, using rectangle of the conditions element
     *
     * @param conditions rectangles conditions
     */
    public RectangleListConditionsImpl(Conditions<FluentWebElement> conditions) {
        this(conditions, input -> input.getElement().getRect(), input -> input.conditions().rectangle());
    }

    @Override
    public RectangleListConditionsImpl not() {
        return new RectangleListConditionsImpl(conditions.not(), objectGetter, conditionsGetter);
    }

    @Override
    public boolean x(int x) {
        return conditions.verify(input -> conditionsGetter.apply(input).x(x));
    }

    @Override
    public boolean y(int y) {
        return conditions.verify(input -> conditionsGetter.apply(input).y(y));
    }

    @Override
    public IntegerConditions x() {
        return new IntegerListConditionsImpl(conditions, input -> input.getElement().getRect().getX());
    }

    @Override
    public IntegerConditions y() {
        return new IntegerListConditionsImpl(conditions, input -> input.getElement().getRect().getY());
    }

    @Override
    public boolean position(int x, int y) {
        return conditions.verify(input -> conditionsGetter.apply(input).position(x, y));
    }

    @Override
    public boolean width(int width) {
        return conditions.verify(input -> conditionsGetter.apply(input).width(width));
    }

    @Override
    public IntegerConditions width() {
        return new IntegerListConditionsImpl(conditions, input -> input.getElement().getRect().getWidth());
    }

    @Override
    public boolean height(int height) {
        return conditions.verify(input -> conditionsGetter.apply(input).height(height));
    }

    @Override
    public IntegerConditions height() {
        return new IntegerListConditionsImpl(conditions, input -> input.getElement().getRect().getHeight());
    }

    @Override
    public boolean dimension(int width, int height) {
        return conditions.verify(input -> conditionsGetter.apply(input).dimension(width, height));
    }

    @Override
    public boolean positionAndDimension(int x, int y, int width, int height) {
        return conditions.verify(input -> conditionsGetter.apply(input).positionAndDimension(x, y, width, height));
    }
}
