/*
 * Copyright (C) 2015 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 com.afwsamples.testdpc.common;

import android.accounts.Account;
import android.content.Intent;
import android.os.PersistableBundle;

import com.afwsamples.testdpc.cosu.EnableCosuActivity;

/**
 * Common utility functions used for retrieving information from the intent that launched TestDPC.
 */
public class LaunchIntentUtil {
    public static final String EXTRA_ACCOUNT_NAME = "account_name";

    public static final String EXTRA_AFFILIATION_ID = "affiliation_id";

    private static final String EXTRA_IS_SETUP_WIZARD = "is_setup_wizard";
    private static final String EXTRA_ACCOUNT = "account";

    private LaunchIntentUtil() {}

    /**
     * @returns true if TestDPC was launched as part of synchronous authentication flow in setup
     * wizard or settings->add account
     */
    public static boolean isSynchronousAuthLaunch(Intent launchIntent) {
        return launchIntent != null
                && (launchIntent.getExtras() != null)
                && (launchIntent.getExtras().get(EXTRA_IS_SETUP_WIZARD) != null);
    }

    /**
     * @returns true if TestDPC was launched as part of a COSU deployment. This is identified by
     * a cosu extra in the admin extras.
     */
    public static boolean isCosuLaunch(PersistableBundle extras) {
        return extras != null && (extras.get(EnableCosuActivity.BUNDLE_KEY_COSU_CONFIG) != null);
    }

    /**
     * @returns true if TestDPC was launched as part of synchronous authentication flow in setup
     * wizard or settings->add account, based upon the extras of the given bundle which was
     * populated by {@link #prepareDeviceAdminExtras(Intent, PersistableBundle)}
     */
    public static boolean isSynchronousAuthLaunch(PersistableBundle extras) {
        // NOTE: Value here is irrelevant, only presence of extra matters - true indicates sync-
        // auth from Setup Wizard, false indicates another path (e.g. Settings->Add Account).
        return extras != null && (extras.get(EXTRA_IS_SETUP_WIZARD) != null);
    }

    /**
     * @returns an account, if TestDPC was informed of which account it was invoked as a result of
     * adding in synchronous auth cases
     */
    public static Account getAddedAccount(Intent intent) {
        return intent != null ? intent.<Account>getParcelableExtra(EXTRA_ACCOUNT) : null;
    }

    /**
     * @returns the account name in the given bundle, as populated by
     * {@link #prepareDeviceAdminExtras(Intent, PersistableBundle)}
     */
    public static String getAddedAccountName(PersistableBundle persistableBundle) {
        return persistableBundle != null
                ? persistableBundle.getString(EXTRA_ACCOUNT_NAME, null) : null;
    }

    /**
     * Copy important intent extras from the launching intent launchIntent into newBundle.
     */
    public static void prepareDeviceAdminExtras(Intent launchIntent, PersistableBundle newBundle) {
        if (isSynchronousAuthLaunch(launchIntent)) {
            boolean isSetupWizard = launchIntent.getBooleanExtra(EXTRA_IS_SETUP_WIZARD, false);

            // Store as String in new bundle, as API 21 doesn't support putBoolean.
            newBundle.putString(EXTRA_IS_SETUP_WIZARD, Boolean.toString(isSetupWizard));

            Account addedAccount = getAddedAccount(launchIntent);
            if (addedAccount != null) {
                newBundle.putString(EXTRA_ACCOUNT_NAME, addedAccount.name);
            }
        }
    }
}