// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.webview_ui_test.test.util;

/*
 * Creates an action which executes on webview.
 */
public abstract class Action {
    /// Executes the action on the WebView.
    public abstract boolean execute(PerformActions performActions) throws Throwable;

    // Creates an action that loads the desired url in the webview upon execution.
    private static class StartingPageAction extends Action {
        private String mUrl;
        public StartingPageAction(String url) {
            mUrl = url;
        }
        @Override
        public boolean execute(PerformActions performActions) throws Throwable {
            performActions.loadUrl(mUrl);
            return true;
        }
        @Override
        public String toString() {
            return "Opening url of starting page" + mUrl;
        }
    }
    // Creates an action that loads the desired url in the webview upon execution.
    private static class LoadPageAction extends Action {
        private String mUrl;
        private boolean mForce;
        public LoadPageAction(String url, boolean force) {
            mUrl = url;
            mForce = force;
        }
        @Override
        public boolean execute(PerformActions performActions) throws Throwable {
            if (mForce) {
                performActions.loadUrl(mUrl);
            }
            return true;
        }
        @Override
        public String toString() {
            return (mForce ? "Forcing load of" : "Entering") + " new page with url " + mUrl;
        }
    }
    // Creates an action that clicks the given xPath upon execution.
    public static class ClickAction extends Action {
        private String mXPath;
        public ClickAction(String xPath) {
            mXPath = xPath;
        }
        @Override
        public boolean execute(PerformActions performActions) throws Throwable {
            return performActions.selectElement(mXPath);
        }
        @Override
        public String toString() {
            return "Clicking element at xPath " + mXPath;
        }
    }
    // Creates an Action that prompts and selects autofill on the given Xpath upon execution.
    public static class AutofillAction extends Action {
        private String mXPath;
        public AutofillAction(String xPath) {
            mXPath = xPath;
        }
        @Override
        public boolean execute(PerformActions performActions) throws Throwable {
            return performActions.autofill(mXPath);
        }
        @Override
        public String toString() {
            return "Autofilling element at xPath " + mXPath;
        }
    }
    // Creates an Action that checks the given XPath has the given expectedValue upon execution.
    public static class ValidateFieldAction extends Action {
        private String mXPath;
        private String mExpectedValue;
        public ValidateFieldAction(String xPath, String expectedValue) {
            mXPath = xPath;
            mExpectedValue = expectedValue;
        }
        @Override
        public boolean execute(PerformActions performActions) throws Throwable {
            return performActions.verifyAutofill(mXPath, mExpectedValue);
        }
        @Override
        public String toString() {
            return "Verifying element at xPath " + mXPath + " has value " + mExpectedValue;
        }
    }

    public static Action createStartingPageAction(String url) {
        return new StartingPageAction(url);
    }

    public static Action createLoadPageAction(String url, boolean force) {
        return new LoadPageAction(url, force);
    }

    public static Action createClickAction(String xPath) {
        return new ClickAction(xPath);
    }

    public static Action createAutofillAction(String xPath) {
        return new AutofillAction(xPath);
    }

    public static Action createValidateFieldAction(String xPath, String expectedValue) {
        return new ValidateFieldAction(xPath, expectedValue);
    }
}
