// Copyright 2013 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.autofill;

import com.google.common.annotations.VisibleForTesting;

import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.ui.base.WindowAndroid;

/**
 * Java-side AutofillDialog and AutofillDialogFactory interfaces, and
 * JNI glue for C++ AutofillDialogControllerAndroid.
 */
@JNINamespace("autofill")
public class AutofillDialogControllerAndroid {
    private static AutofillDialogFactory sDialogFactory;

    private long mNativeDelegate;  // could be 0 after onDestroy().
    private AutofillDialog mDialog;

    /**
     * An interface to the two possible continuations for the dialog.
     * The dialog is expected to be dismissed when either of the calls is made.
     */
    public interface AutofillDialogDelegate {
        /**
         * Cancels the requestAutocomplete.
         */
        void dialogCancel();

        /**
         * Submits the data to the web-page and persists the last account/card/address choices.
         * @param fullWallet Resulting billing/shipping information obtained from the user
         * @param lastUsedChoiceIsAutofill Whether the last selected data source is Autofill
         * @param lastUsedAccountName The last selected account name, or null
         * @param guidLastUsedBilling GUID of the last selected Autofill billing address, or null
         * @param guidLastUsedShipping GUID of the last selected Autofill shipping address, or null
         * @param guidLastUsedCard GUID of the last selected Autofill credit card, or null
         */
        void dialogContinue(
                AutofillDialogResult.ResultWallet fullWallet,
                boolean lastUsedChoiceIsAutofill, String lastUsedAccountName,
                String guidLastUsedBilling, String guidLastUsedShipping, String guidLastUsedCard);
    }

    /**
     * An interface that exposes the necessary functionality for an Autofill dialog.
     * Note that all information necessary to construct the dialog is passed to the factory.
     */
    public interface AutofillDialog {
        /**
         * Notifies the dialog that the C++ side is gone.
         * The dialog needs to clear its reference to the no longer valid AutofillDialogDelegate.
         */
        void onDestroy();
    }

    /**
     * An interface to the factory that creates Autofill dialogs.
     */
    public interface AutofillDialogFactory {
        /**
         * Creates the dialog.
         * Reasonable attempts should be made to respect "initial choices",
         * Initial choices don't have to be self-consistent or valid.
         *
         * @param delegate Continuations for the dialog
         * @param windowAndroid Context in which the dialog should be shown
         * @param requestFullBillingAddress Whether the full billing address is required
         * @param requestShippingAddress Whether the shipping address is required
         * @param requestPhoneNumbers Whether the phone numbers are required in addresses
         * @param incognitoMode True if the dialog started from an incognito tab
         * @param initialChoiceIsAutofill Whether the selected data source should be Autofill
         * @param initialAccountName Account to be selected, or null
         * @param initialBillingGuid GUID of the initial billing address selection in Autofill
         * @param initialShippingGuid GUID of the initial shipping address selection in Autofill
         * @param initialCardGuid GUID of the initial credit card selection in Autofill
         * @param merchantDomain Scheme+origin for the originating web page, or null
         * @param shippingCountries A list of allowed shipping countries, or null
         * @param creditCardTypes A list of allowed credit card types (e.g. "VISA"), or null
         * @return The Autofill dialog that would later call into the delegate, or null
         */
        AutofillDialog createDialog(
                final AutofillDialogDelegate delegate,
                final WindowAndroid windowAndroid,
                final boolean requestFullBillingAddress, final boolean requestShippingAddress,
                final boolean requestPhoneNumbers,
                final boolean incognitoMode,
                final boolean initialChoiceIsAutofill, final String initialAccountName,
                final String initialBillingGuid, final String initialShippingGuid,
                final String initialCardGuid,
                final String merchantDomain,
                final String[] shippingCountries,
                final String[] creditCardTypes);
    }

    /**
     * Sets the factory to be used.
     * @param factory An instance of the AutofillDialogFactory that will handle requests.
     */
    public static void setDialogFactory(AutofillDialogFactory factory) {
        sDialogFactory = factory;
    }

    @VisibleForTesting
    private AutofillDialogControllerAndroid(
            final long nativeAutofillDialogControllerAndroid,
            final WindowAndroid windowAndroid,
            final boolean requestFullBillingAddress, final boolean requestShippingAddress,
            final boolean requestPhoneNumbers,
            final boolean incognitoMode,
            final boolean initialChoiceIsAutofill, final String initialWalletAccountName,
            final String initialBillingGuid, final String initialShippingGuid,
            final String initialCardGuid,
            final String merchantDomain,
            final String[] shippingCountries,
            final String[] creditCardTypes) {
        mNativeDelegate = nativeAutofillDialogControllerAndroid;

        if (sDialogFactory == null) {
            nativeDialogCancel(mNativeDelegate);
            return;
        }

        AutofillDialogDelegate delegate = new AutofillDialogDelegate() {
            @Override
            public void dialogCancel() {
                nativeDialogCancel(mNativeDelegate);
            }

            @Override
            public void dialogContinue(
                    AutofillDialogResult.ResultWallet fullWallet,
                    boolean lastUsedChoiceIsAutofill, String lastUsedAccountName,
                    String guidLastUsedBilling, String guidLastUsedShipping,
                    String guidLastUsedCard) {
                nativeDialogContinue(mNativeDelegate, fullWallet,
                        lastUsedChoiceIsAutofill, lastUsedAccountName,
                        guidLastUsedBilling, guidLastUsedShipping, guidLastUsedCard);
            }
        };

        mDialog = sDialogFactory.createDialog(
                delegate,
                windowAndroid,
                requestFullBillingAddress, requestShippingAddress,
                requestPhoneNumbers,
                incognitoMode,
                initialChoiceIsAutofill, initialWalletAccountName,
                initialBillingGuid, initialShippingGuid, initialCardGuid,
                merchantDomain,
                shippingCountries,
                creditCardTypes);
        if (mDialog == null) {
            nativeDialogCancel(mNativeDelegate);
            return;
        }
    }

    @CalledByNative
    private static AutofillDialogControllerAndroid create(
            final long nativeAutofillDialogControllerAndroid,
            final WindowAndroid windowAndroid,
            final boolean requestFullBillingAddress, final boolean requestShippingAddress,
            final boolean requestPhoneNumbers,
            final boolean incognitoMode,
            final boolean initialChoiceIsAutofill, final String initialWalletAccountName,
            final String initialBillingGuid, final String initialShippingGuid,
            final String initialCreditCardGuid,
            final String merchantDomain,
            final String[] shippingCountries,
            final String[] creditCardTypes) {
        return new AutofillDialogControllerAndroid(
                nativeAutofillDialogControllerAndroid, windowAndroid,
                requestFullBillingAddress, requestShippingAddress, requestPhoneNumbers,
                incognitoMode,
                initialChoiceIsAutofill, initialWalletAccountName,
                initialBillingGuid, initialShippingGuid,
                initialCreditCardGuid,
                merchantDomain,
                shippingCountries,
                creditCardTypes);
    }

    @CalledByNative
    private static boolean isDialogAllowed(boolean isInvokedFromTheSameOrigin) {
        // TODO(aruslan): cross-origin invocations should be allowed with a
        // warning messge.
        return isInvokedFromTheSameOrigin;
    }

    @CalledByNative
    private void onDestroy() {
        if (mNativeDelegate == 0) return;

        if (mDialog != null) mDialog.onDestroy();

        mDialog = null;
        mNativeDelegate = 0;
    }

    // Calls from Java to C++ AutofillDialogControllerAndroid:

    private native void nativeDialogCancel(long nativeAutofillDialogControllerAndroid);
    private native void nativeDialogContinue(long nativeAutofillDialogControllerAndroid,
            Object fullWallet,
            boolean lastUsedChoiceIsAutofill, String lastUsedAccountName,
            String guidLastUsedBilling, String guidLastUsedShipping, String guidLastUsedCard);
}
