// 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.base;

import android.content.Context;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Maintains the {@link Context}-to-"context type" mapping. The context type
 * {@code MODE_APP} is chosen for the application context associated with
 * the activity running in application mode, while {@code MODE_NORMAL} for main
 * Chromium activity.
 *
 * <p>Used as singleton instance.
 */
public class ContextTypes {

    // Available context types.
    public static final int CONTEXT_TYPE_NORMAL = 1;
    public static final int CONTEXT_TYPE_WEBAPP = 2;

    private final Map<Context, Integer> mContextMap;

    private ContextTypes() {
        mContextMap = new ConcurrentHashMap<Context, Integer>();
    }

    private static class ContextTypesHolder {
        private static final ContextTypes INSTANCE = new ContextTypes();
    }

    public static ContextTypes getInstance() {
        return ContextTypesHolder.INSTANCE;
    }

    /**
     * Adds the mapping for the given {@link Context}.
     *
     * @param context {@link Context} in interest
     * @param type the type associated with the context
     * @throws IllegalArgumentException if type is not a valid one.
     */
    public void put(Context context, int type) throws IllegalArgumentException {
        if (type != CONTEXT_TYPE_NORMAL && type != CONTEXT_TYPE_WEBAPP) {
            throw new IllegalArgumentException("Wrong context type");
        }
        mContextMap.put(context, type);
    }

    /**
     * Removes the mapping for the given context.
     *
     * @param context {@link Context} in interest
     */
    public void remove(Context context) {
        mContextMap.remove(context);
    }

    /**
     * Returns type of the given context.
     *
     * @param context {@link Context} in interest
     * @return type associated with the context. Returns {@code MODE_NORMAL} by
     *     default if the mapping for the queried context is not present.
     */
    public int getType(Context context) {
        Integer contextType = mContextMap.get(context);
        return contextType == null ? CONTEXT_TYPE_NORMAL : contextType;
    }

    /**
     * Returns whether activity is running in web app mode.
     *
     * @param appContext {@link Context} in interest
     * @return {@code true} when activity is running in web app mode.
     */
    @CalledByNative
    public static boolean isRunningInWebapp(Context appContext) {
        return ContextTypes.getInstance().getType(appContext)
                == CONTEXT_TYPE_WEBAPP;
    }

    /**
     * Checks if the mapping exists for the given context.
     *
     * @param context {@link Context} in interest
     * @return {@code true} if the mapping exists; otherwise {@code false}
     */
    public boolean contains(Context context) {
        return mContextMap.containsKey(context);
    }
}
