// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.vr.util;

import static org.chromium.chrome.browser.vr.VrBrowserTestFramework.POLL_CHECK_INTERVAL_SHORT_MS;

import android.content.Intent;
import android.net.Uri;

import org.junit.Assert;

import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.vr.TestVrShellDelegate;
import org.chromium.chrome.browser.vr.VrIntentDelegate;
import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.chrome.browser.vr.VrShell;
import org.chromium.chrome.browser.vr.VrShellDelegate;
import org.chromium.content_public.browser.test.util.CriteriaHelper;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * Class containing utility functions for transitioning between different states in the VR Browser.
 */
public class VrBrowserTransitionUtils extends VrTransitionUtils {
    /**
     * Forces Chrome into the VR Browser.
     *
     * @return True if the request to enter the VR Browser succeeded, false otherwise.
     */
    public static boolean forceEnterVrBrowser() {
        Boolean result = false;
        try {
            result = ThreadUtils.runOnUiThreadBlocking(
                    () -> { return VrShellDelegate.enterVrIfNecessary(); });
        } catch (ExecutionException e) {
        }
        return result;
    }

    /**
     * Forces Chrome into the VR Browser, causing a test failure if it is not entered in the
     * allotted time.
     *
     * @param timeoutMs The amount of time in milliseconds to wait for VR Browser entry before
     *            failing.
     */
    public static void forceEnterVrBrowserOrFail(int timeoutMs) {
        Assert.assertTrue("Request to enter VR Browser failed", forceEnterVrBrowser());
        waitForVrEntry(timeoutMs);
    }

    /**
     * @return Whether the VR Browser's back button is enabled.
     */
    public static Boolean isBackButtonEnabled() {
        final AtomicBoolean isBackButtonEnabled = new AtomicBoolean();
        ThreadUtils.runOnUiThreadBlocking(() -> {
            isBackButtonEnabled.set(
                    TestVrShellDelegate.getVrShellForTesting().isBackButtonEnabled());
        });
        return isBackButtonEnabled.get();
    }

    /**
     * @return Whether the VR Browers's forward button is enabled.
     */
    public static Boolean isForwardButtonEnabled() {
        final AtomicBoolean isForwardButtonEnabled = new AtomicBoolean();
        ThreadUtils.runOnUiThreadBlocking(() -> {
            isForwardButtonEnabled.set(
                    TestVrShellDelegate.getVrShellForTesting().isForwardButtonEnabled());
        });
        return isForwardButtonEnabled.get();
    }

    /**
     * Navigates the VR Browser back.
     */
    public static void navigateBack() {
        ThreadUtils.runOnUiThreadBlocking(
                () -> { TestVrShellDelegate.getVrShellForTesting().navigateBack(); });
    }

    /**
     * Navigates the VR Browser forward.
     */
    public static void navigateForward() {
        ThreadUtils.runOnUiThreadBlocking(
                () -> { TestVrShellDelegate.getVrShellForTesting().navigateForward(); });
    }

    /**
     * Sends an intent to Chrome telling it to launch in VR mode.
     *
     * @param url String containing the URL to open.
     */
    public static void sendVrLaunchIntent(String url) {
        // Create an intent that will launch Chrome at the specified URL.
        final Intent intent =
                new Intent(ContextUtils.getApplicationContext(), ChromeLauncherActivity.class);
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        intent.addCategory(VrIntentDelegate.DAYDREAM_CATEGORY);
        VrModuleProvider.getIntentDelegate().setupVrIntent(intent);

        ThreadUtils.runOnUiThreadBlocking(
                () -> { VrShellDelegate.getVrDaydreamApi().launchInVr(intent); });
    }

    /**
     * Sends an intent to Chrome telling it to open a tab in 2D mode.
     */
    public static void send2dMainIntent() {
        final Intent intent =
                new Intent(ContextUtils.getApplicationContext(), ChromeTabbedActivity.class);
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        ThreadUtils.runOnUiThreadBlocking(
                () -> { ContextUtils.getApplicationContext().startActivity(intent); });
    }

    /**
     * Waits until either a JavaScript dialog or permission prompt is being displayed using the
     * Android native UI in the VR browser.
     *
     * @param timeout How long in milliseconds to wait before timing out and failing.
     */
    public static void waitForNativeUiPrompt(final int timeout) {
        CriteriaHelper.pollInstrumentationThread(() -> {
            VrShell vrShell = TestVrShellDelegate.getVrShellForTesting();
            return vrShell.isDisplayingDialogView();
        }, "Native UI prompt did not display", timeout, POLL_CHECK_INTERVAL_SHORT_MS);
    }
}
