// 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 org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;

/**
 * Java-side result of a non-cancelled AutofillDialog invocation, and
 * JNI glue for C++ AutofillDialogResult used by AutofillDialogControllerAndroid.
 */
@JNINamespace("autofill")
public class AutofillDialogResult {
    /**
     * Information about the credit card in the dialog result.
     */
    public static class ResultCard {
        private final int mExpirationMonth;
        private final int mExpirationYear;
        private final String mPan;
        private final String mCvn;

        /**
         * Creates a ResultCard.
         * @param expirationMonth Expiration month
         * @param expirationYear Expiration year
         * @param pan Credit card number
         * @param cvn Credit card verification number
         */
        public ResultCard(int expirationMonth, int expirationYear, String pan, String cvn) {
            mExpirationMonth = expirationMonth;
            mExpirationYear = expirationYear;
            mPan = pan;
            mCvn = cvn;
        }

        /**
         * @return Expiration month
         */
        @CalledByNative("ResultCard")
        public int getExpirationMonth() {
            return mExpirationMonth;
        }

        /**
         * @return Expiration year
         */
        @CalledByNative("ResultCard")
        public int getExpirationYear() {
            return mExpirationYear;
        }

        /**
         * @return Credit card number
         */
        @CalledByNative("ResultCard")
        public String getPan() {
            return mPan;
        }

        /**
         * @return Credit card verification number
         */
        @CalledByNative("ResultCard")
        public String getCvn() {
            return mCvn;
        }
    }

    /**
     * Information about an address in the dialog result.
     */
    public static class ResultAddress {
        private final String mName;
        private final String mPhoneNumber;
        private final String mStreetAddress;
        private final String mLocality;
        private final String mDependentLocality;
        private final String mAdministrativeArea;
        private final String mPostalCode;
        private final String mSortingCode;
        private final String mCountryCode;
        private final String mLanguageCode;

        /**
         * Creates a ResultAddress.
         * Any parameter can be empty or null.
         * @param name Full name
         * @param phoneNumber Phone number
         * @param streetAddress Street address
         * @param locality Locality / City
         * @param dependentLocality Inner-city district / Suburb / Dependent locality
         * @param administrativeArea Region / State
         * @param postalCode Postal code
         * @param sortingCode Sorting code
         * @param countryCode Country code
         * @param languageCode Language code
         */
        public ResultAddress(
                String name, String phoneNumber,
                String streetAddress,
                String locality, String dependentLocality,
                String administrativeArea, String postalCode, String sortingCode,
                String countryCode, String languageCode) {
            mName = name;
            mPhoneNumber = phoneNumber;
            mStreetAddress = streetAddress;
            mLocality = locality;
            mDependentLocality = dependentLocality;
            mAdministrativeArea = administrativeArea;
            mPostalCode = postalCode;
            mSortingCode = sortingCode;
            mCountryCode = countryCode;
            mLanguageCode = languageCode;
        }

        /**
         * @return Full name
         */
        @CalledByNative("ResultAddress")
        public String getName() {
            return mName;
        }

        /**
         * @return Phone number
         */
        @CalledByNative("ResultAddress")
        public String getPhoneNumber() {
            return mPhoneNumber;
        }

        /**
         * @return Street address
         */
        @CalledByNative("ResultAddress")
        public String getStreetAddress() {
            return mStreetAddress;
        }

        /**
         * @return Locality (city)
         */
        @CalledByNative("ResultAddress")
        public String getLocality() {
            return mLocality;
        }

        /**
         * @return Dependent locality (inner-city district / suburb)
         */
        @CalledByNative("ResultAddress")
        public String getDependentLocality() {
            return mDependentLocality;
        }

        /**
         * @return Administrative area (region / state)
         */
        @CalledByNative("ResultAddress")
        public String getAdministrativeArea() {
            return mAdministrativeArea;
        }

        /**
         * @return Postal code
         */
        @CalledByNative("ResultAddress")
        public String getPostalCode() {
            return mPostalCode;
        }

        /**
         * @return Sorting code
         */
        @CalledByNative("ResultAddress")
        public String getSortingCode() {
            return mSortingCode;
        }

        /**
         * @return Country code
         */
        @CalledByNative("ResultAddress")
        public String getCountryCode() {
            return mCountryCode;
        }

        /**
         * @return Language code
         */
        @CalledByNative("ResultAddress")
        public String getLanguageCode() {
            return mLanguageCode;
        }
    }

    /**
     * A response from the dialog.
     */
    public static class ResultWallet {
        private final String mEmail;
        private final String mGoogleTransactionId;
        private final ResultCard mCard;
        private final ResultAddress mBillingAddress;
        private final ResultAddress mShippingAddress;

        /**
         * Creates a ResultWallet.
         * Any fields could be empty or null.
         * @param email Email address
         * @param googleTransactionId Google transaction ID if any
         * @param card Information about the credit card
         * @param billingAddress Information about the billing address
         * @param shippingAddress Information about the shipping address
         */
        public ResultWallet(
                String email, String googleTransactionId,
                ResultCard card, ResultAddress billingAddress, ResultAddress shippingAddress) {
            mEmail = email;
            mGoogleTransactionId = googleTransactionId;
            mCard = card;
            mBillingAddress = billingAddress;
            mShippingAddress = shippingAddress;
        }

        /**
         * @return Email address
         */
        @CalledByNative("ResultWallet")
        public String getEmail() {
            return mEmail;
        }

        /**
         * @return Google transaction ID if any
         */
        @CalledByNative("ResultWallet")
        public String getGoogleTransactionId() {
            return mGoogleTransactionId;
        }

        /**
         * @return Credit card information, or null
         */
        @CalledByNative("ResultWallet")
        public ResultCard getCard() {
            return mCard;
        }

        /**
         * @return Billing address information, or null
         */
        @CalledByNative("ResultWallet")
        public ResultAddress getBillingAddress() {
            return mBillingAddress;
        }

        /**
         * @return Shipping address information, or null
         */
        @CalledByNative("ResultWallet")
        public ResultAddress getShippingAddress() {
            return mShippingAddress;
        }
    }
}
