/*
 Copyright 2014 Red Hat, Inc. and/or its affiliates.

 This file is part of darcy-webdriver.

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.redhat.darcy.webdriver;

import com.redhat.darcy.ui.FindableNotPresentException;
import com.redhat.darcy.web.api.Alert;
import com.redhat.darcy.webdriver.internal.TargetedAlert;

import org.openqa.selenium.NoAlertPresentException;

import java.util.function.Consumer;
import java.util.function.Function;

/**
 * Implements the darcy-web Alert interface by forwarding calls to WebDriver's
 * {@link org.openqa.selenium.Alert} interface.
 */
public class WebDriverAlert implements Alert {
    private final TargetedAlert alert;

    public WebDriverAlert(TargetedAlert alert) {
        this.alert = alert;
    }
    
    @Override
    public boolean isPresent() {
        return alert.isPresent();
    }
    
    @Override
    public void accept() {
        attempt(org.openqa.selenium.Alert::accept);
    }
    
    @Override
    public void dismiss() {
        attempt(org.openqa.selenium.Alert::dismiss);
    }
    
    @Override
    public void sendKeys(CharSequence keysToSend) {
        attempt(a -> a.sendKeys(keysToSend.toString()));
    }
    
    @Override
    public String getText() {
        return attemptAndGet(org.openqa.selenium.Alert::getText);
    }

    private void attempt(Consumer<org.openqa.selenium.Alert> action) {
        try {
            action.accept(alert);
        } catch (NoAlertPresentException e) {
            throw new FindableNotPresentException(this, e);
        }
    }

    private <T> T attemptAndGet(Function<org.openqa.selenium.Alert, T> action) {
        try {
            return action.apply(alert);
        } catch (NoAlertPresentException e) {
            throw new FindableNotPresentException(this, e);
        }
    }
}