/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.platform.helpers;

import android.support.test.uiautomator.Direction;
import android.support.test.uiautomator.UiObject2;

public interface IChromeHelper extends IAppHelper {
    public enum MenuItem {
        BOOKMARKS("Bookmarks"),
        NEW_TAB("New tab"),
        CLOSE_ALL_TABS("Close all tabs"),
        DOWNLOADS("Downloads"),
        HISTORY("History"),
        SETTINGS("Settings");

        private String mDisplayName;

        MenuItem(String displayName) {
            mDisplayName = displayName;
        }

        @Override
        public String toString() {
            return mDisplayName;
        }
    }

    public enum ClearRange {
        PAST_HOUR("past hour"),
        PAST_DAY("past day"),
        PAST_WEEK("past week"),
        LAST_4_WEEKS("last 4 weeks"),
        BEGINNING_OF_TIME("beginning of time");

        private String mDisplayName;

        ClearRange(String displayName) {
            mDisplayName = displayName;
        }

        @Override
        public String toString() {
            return mDisplayName;
        }
    }

    /**
     * Setup expectations: Chrome is open and on a standard page, i.e. a tab is open.
     *
     * <p>This method will open the URL supplied and block until the page is open.
     */
    public abstract void openUrl(String url);

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will scroll the page as directed and block until idle.
     */
    public abstract void flingPage(Direction dir);

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will open the overload menu, indicated by three dots and block until open.
     */
    public abstract void openMenu();

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will open provided item in the menu.
     */
    public abstract void openMenuItem(IChromeHelper.MenuItem menuItem);

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will open provided item in the menu.
     *
     * @param menuItem The name of menu item.
     * @param waitForPageLoad Wait for the page to load completely or not.
     */
    public default void openMenuItem(IChromeHelper.MenuItem menuItem, boolean waitForPageLoad) {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will add a new tab and land on the webpage of given url.
     */
    public abstract void addNewTab(String url);

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will go to tab switcher by clicking tab switcher button.
     */
    public abstract void openTabSwitcher();

    /**
     * Setup expectations: Chrome is open on a page or in tab switcher.
     *
     * <p>This method will switch to the tab at tabIndex.
     */
    public abstract void switchTab(int tabIndex);

    /**
     * Setup expectations: Chrome has at least one tab.
     *
     * <p>This method will close all tabs.
     */
    public abstract void closeAllTabs();

    /**
     * Setup expectations: Chrome is open on a page and the tabs are treated as apps.
     *
     * <p>This method will change the settings to treat tabs inside of Chrome and block until Chrome
     * is open on the original tab.
     */
    public abstract void mergeTabs();

    /**
     * Setup expectations: Chrome is open on a page and the tabs are merged.
     *
     * <p>This method will change the settings to treat tabs outside of Chrome and block until
     * Chrome is open on the original tab.
     */
    public abstract void unmergeTabs();

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will reload the page by clicking the refresh button, and block until the page
     * is reopened.
     */
    public abstract void reloadPage();

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will stop loading page then reload the page by clicking the refresh button,
     * and block until the page is reopened.
     */
    public default void stopAndReloadPage() {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will stop loading page then reload the page by clicking the refresh button,
     *
     * @param waitForPageLoad Wait for the page to load completely or not.
     */
    public default void stopAndReloadPage(boolean waitForPageLoad) {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method is getter for contentDescription of Tab elements.
     */
    public abstract String getTabDescription();

    /**
     * Setup expectations: Chrome is open on a History page.
     *
     * <p>This method clears browser history for provided period of time.
     */
    public abstract void clearBrowsingData(IChromeHelper.ClearRange range);

    /**
     * Setup expectations: Chrome is open on a Downloads page.
     *
     * <p>This method checks header is displayed on Downloads page.
     */
    public abstract void checkIfDownloadsOpened();

    /**
     * Setup expectations: Chrome is open on a Settings page.
     *
     * <p>This method clicks on Privacy setting on Settings page.
     */
    public abstract void openPrivacySettings();

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>This method will add the current page to Bookmarks
     */
    public default boolean addCurrentPageToBookmark() {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a Bookmarks page.
     *
     * <p>This method selects a bookmark from the Bookmarks page.
     *
     * @param index The Index of bookmark to select.
     */
    public default void openBookmark(int index) {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a Bookmarks page.
     *
     * <p>This method selects a bookmark from the Bookmarks page.
     *
     * @param bookmarkName The string of the target bookmark to select.
     * @param waitForPageLoad Wait for the page to load completely or not.
     */
    public default void openBookmark(String bookmarkName, boolean waitForPageLoad) {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>Selects the link with specific text.
     *
     * @param linkText The text of the link to select.
     */
    public default void selectLink(String linkText) {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>Performs a scroll gesture on the page.
     *
     * @param dir The direction on the page to scroll.
     * @param percent The distance to scroll as a percentage of the page's visible size.
     */
    public default void scrollPage(Direction dir, float percent) {
        throw new UnsupportedOperationException("Not yet implemented.");
    }

    /**
     * Setup expectations: Chrome is open on a page.
     *
     * <p>Get the UiObject2 of the page screen.
     */
    public default UiObject2 getWebPage() {
        throw new UnsupportedOperationException("Not yet implemented.");
    }
}
