// 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.test.util;

import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.SharedPreferences;
import android.test.mock.MockContentResolver;
import android.test.mock.MockContext;

import java.util.HashMap;
import java.util.Map;

/**
 * ContextWrapper that adds functionality for SharedPreferences and a way to set and retrieve flags.
 */
public class AdvancedMockContext extends ContextWrapper {

    private final MockContentResolver mMockContentResolver = new MockContentResolver();

    private final Map<String, SharedPreferences> mSharedPreferences =
            new HashMap<String, SharedPreferences>();

    private final Map<String, Boolean> mFlags = new HashMap<String, Boolean>();

    public AdvancedMockContext(Context base) {
        super(base);
    }

    public AdvancedMockContext() {
        super(new MockContext());
    }

    @Override
    public String getPackageName() {
        return getBaseContext().getPackageName();
    }

    @Override
    public Context getApplicationContext() {
        return this;
    }

    @Override
    public ContentResolver getContentResolver() {
        return mMockContentResolver;
    }

    public MockContentResolver getMockContentResolver() {
        return mMockContentResolver;
    }

    @Override
    public SharedPreferences getSharedPreferences(String name, int mode) {
        synchronized (mSharedPreferences) {
            if (!mSharedPreferences.containsKey(name)) {
                // Auto-create shared preferences to mimic Android Context behavior
                mSharedPreferences.put(name, new InMemorySharedPreferences());
            }
            return mSharedPreferences.get(name);
        }
    }

    public void addSharedPreferences(String name, Map<String, Object> data) {
        synchronized (mSharedPreferences) {
            mSharedPreferences.put(name, new InMemorySharedPreferences(data));
        }
    }

    public void setFlag(String key) {
        mFlags.put(key, true);
    }

    public void clearFlag(String key) {
        mFlags.remove(key);
    }

    public boolean isFlagSet(String key) {
        return mFlags.containsKey(key) && mFlags.get(key);
    }

    public static class MapBuilder {

        private final Map<String, Object> mData = new HashMap<String, Object>();

        public static MapBuilder create() {
            return new MapBuilder();
        }

        public MapBuilder add(String key, Object value) {
            mData.put(key, value);
            return this;
        }

        public Map<String, Object> build() {
            return mData;
        }

    }
}
