package Task_19.Services;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.List;

/**
 * Сервис корзины.
 */
public class CartService {

    protected WebDriver webDriver;
    protected WebDriverWait wait;

    /**
     * Инициализация структур.
     * @param driver
     */
    public CartService(WebDriver driver) {
        webDriver = driver;
        wait = new WebDriverWait(driver, 10);
    }

    /**
     * Возвращает количество товаров в корзине.
     * @return
     */
    public Integer getCountInQuantity(){
        WebElement quantity = webDriver.findElement(By.cssSelector("div#cart>a.content>span.quantity"));
        return Integer.parseInt(quantity.getAttribute("innerText"));
    }

    /**
     *
     * @return
     */
    public Integer getCountProductInShortcut(){
        List<WebElement> shortcuts = webDriver.findElements(By.cssSelector("ul.shortcuts"));
        return shortcuts.size();
    }

    /**
     * Очищает корзину.
     */
    public void clear(){
        Integer shortcuts_count = getCountProductInShortcut();

        for (int i = 0; i < shortcuts_count; i++) {
            (new WebDriverWait(webDriver, 4))
                .until((ExpectedCondition<Boolean>) d -> {
                    webDriver.findElement(By.cssSelector("button[type='submit'][name='remove_cart_item']")).click();
                    Integer count = webDriver.findElements(By.cssSelector("ul.shortcuts")).size();

                    return count == 0 ? true : null;
                });
        }
    }

    /**
     * Открывает корзину.
     */
    public void open(){
        webDriver.findElement(By.cssSelector("div#cart>a.link")).click();
    }

    /**
     * Добавление товара.
     */
    public void add(){
        // количество товаров в корзине до добавления товара
        Integer old_count = getCountInQuantity();

        webDriver.findElement(By.cssSelector("button[type='submit'][name='add_cart_product']")).click();

        (new WebDriverWait(webDriver, 4))
                .until((ExpectedCondition<Boolean>) d -> {
                    List<WebElement> lst = d.findElements(By.cssSelector("div#cart>a.content>span.quantity"));

                    return Integer.parseInt(lst.get(0).getAttribute("innerText")) > old_count ? true : null;
                });
    }
}
