/*
 * Copyright (C) 2008 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 android.content.cts;

import java.util.HashMap;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.os.CancellationSignal;
import android.text.TextUtils;

public class MockContentProvider extends ContentProvider {

    private SQLiteOpenHelper mOpenHelper;

    private static final String AUTHORITY = "ctstest";
    private static final String DBNAME = "ctstest.db";
    private static final int DBVERSION = 2;

    private static final UriMatcher URL_MATCHER;
    private static final int TESTTABLE1 = 1;
    private static final int TESTTABLE1_ID = 2;
    private static final int TESTTABLE1_CROSS = 3;
    private static final int TESTTABLE2 = 4;
    private static final int TESTTABLE2_ID = 5;

    private static HashMap<String, String> CTSDBTABLE1_LIST_PROJECTION_MAP;
    private static HashMap<String, String> CTSDBTABLE2_LIST_PROJECTION_MAP;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DBNAME, null, DBVERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE TestTable1 ("
                    + "_id INTEGER PRIMARY KEY, " + "key TEXT, " + "value INTEGER"
                    + ");");

            db.execSQL("CREATE TABLE TestTable2 ("
                    + "_id INTEGER PRIMARY KEY, " + "key TEXT, " + "value INTEGER"
                    + ");");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS TestTable1");
            db.execSQL("DROP TABLE IF EXISTS TestTable2");
            onCreate(db);
        }
    }

    @Override
    public boolean onCreate() {
        mOpenHelper = new DatabaseHelper(getContext());
        return true;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        String segment;
        int count;

        switch (URL_MATCHER.match(uri)) {
        case TESTTABLE1:
            if (null == selection) {
                // get the count when remove all rows
                selection = "1";
            }
            count = db.delete("TestTable1", selection, selectionArgs);
            break;
        case TESTTABLE1_ID:
            segment = uri.getPathSegments().get(1);
            count = db.delete("TestTable1", "_id=" + segment +
                    (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""),
                    selectionArgs);
            break;
        case TESTTABLE2:
            count = db.delete("TestTable2", selection, selectionArgs);
            break;
        case TESTTABLE2_ID:
            segment = uri.getPathSegments().get(1);
            count = db.delete("TestTable2", "_id=" + segment +
                    (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""),
                    selectionArgs);
            break;
        default:
            throw new IllegalArgumentException("Unknown URL " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    @Override
    public String getType(Uri uri) {
        switch (URL_MATCHER.match(uri)) {
        case TESTTABLE1:
            return "vnd.android.cursor.dir/com.android.content.testtable1";
        case TESTTABLE1_ID:
            return "vnd.android.cursor.item/com.android.content.testtable1";
        case TESTTABLE1_CROSS:
            return "vnd.android.cursor.cross/com.android.content.testtable1";
        case TESTTABLE2:
            return "vnd.android.cursor.dir/com.android.content.testtable2";
        case TESTTABLE2_ID:
            return "vnd.android.cursor.item/com.android.content.testtable2";

        default:
            throw new IllegalArgumentException("Unknown URL " + uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues initialValues) {
        long rowID;
        ContentValues values;
        String table;
        Uri testUri;

        if (initialValues != null)
            values = new ContentValues(initialValues);
        else
            values = new ContentValues();

        if (values.containsKey("value") == false)
            values.put("value", -1);

        switch (URL_MATCHER.match(uri)) {
        case TESTTABLE1:
            table = "TestTable1";
            testUri = Uri.parse("content://" + AUTHORITY + "/testtable1");
            break;
        case TESTTABLE2:
            table = "TestTable2";
            testUri = Uri.parse("content://" + AUTHORITY + "/testtable2");
            break;
        default:
            throw new IllegalArgumentException("Unknown URL " + uri);
        }

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        rowID = db.insert(table, "key", values);

        if (rowID > 0) {
            Uri url = ContentUris.withAppendedId(testUri, rowID);
            getContext().getContentResolver().notifyChange(url, null);
            return url;
        }

        throw new SQLException("Failed to insert row into " + uri);
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        return query(uri, projection, selection, selectionArgs, sortOrder, null);
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) {

        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

        switch (URL_MATCHER.match(uri)) {
        case TESTTABLE1:
            qb.setTables("TestTable1");
            qb.setProjectionMap(CTSDBTABLE1_LIST_PROJECTION_MAP);
            break;

        case TESTTABLE1_ID:
            qb.setTables("TestTable1");
            qb.appendWhere("_id=" + uri.getPathSegments().get(1));
            break;

        case TESTTABLE1_CROSS:
            // Create a ridiculous cross-product of the test table.  This is done
            // to create an artificially long-running query to enable us to test
            // remote query cancellation in ContentResolverTest.
            qb.setTables("TestTable1 a, TestTable1 b, TestTable1 c, TestTable1 d, TestTable1 e");
            break;

        case TESTTABLE2:
            qb.setTables("TestTable2");
            qb.setProjectionMap(CTSDBTABLE2_LIST_PROJECTION_MAP);
            break;

        case TESTTABLE2_ID:
            qb.setTables("TestTable2");
            qb.appendWhere("_id=" + uri.getPathSegments().get(1));
            break;

        default:
            throw new IllegalArgumentException("Unknown URL " + uri);
        }

        /* If no sort order is specified use the default */
        String orderBy;
        if (TextUtils.isEmpty(sortOrder))
            orderBy = "_id";
        else
            orderBy = sortOrder;

        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy,
                null, cancellationSignal);

        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        String segment;
        int count;

        switch (URL_MATCHER.match(uri)) {
        case TESTTABLE1:
            count = db.update("TestTable1", values, selection, selectionArgs);
            break;

        case TESTTABLE1_ID:
            segment = uri.getPathSegments().get(1);
            count = db.update("TestTable1", values, "_id=" + segment +
                    (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""),
                    selectionArgs);
            break;

        case TESTTABLE2:
            count = db.update("TestTable2", values, selection, selectionArgs);
            break;

        case TESTTABLE2_ID:
            segment = uri.getPathSegments().get(1);
            count = db.update("TestTable2", values, "_id=" + segment +
                    (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""),
                    selectionArgs);
            break;

        default:
            throw new IllegalArgumentException("Unknown URL " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    static {
        URL_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
        URL_MATCHER.addURI(AUTHORITY, "testtable1", TESTTABLE1);
        URL_MATCHER.addURI(AUTHORITY, "testtable1/#", TESTTABLE1_ID);
        URL_MATCHER.addURI(AUTHORITY, "testtable1/cross", TESTTABLE1_CROSS);
        URL_MATCHER.addURI(AUTHORITY, "testtable2", TESTTABLE2);
        URL_MATCHER.addURI(AUTHORITY, "testtable2/#", TESTTABLE2_ID);

        CTSDBTABLE1_LIST_PROJECTION_MAP = new HashMap<String, String>();
        CTSDBTABLE1_LIST_PROJECTION_MAP.put("_id", "_id");
        CTSDBTABLE1_LIST_PROJECTION_MAP.put("key", "key");
        CTSDBTABLE1_LIST_PROJECTION_MAP.put("value", "value");

        CTSDBTABLE2_LIST_PROJECTION_MAP = new HashMap<String, String>();
        CTSDBTABLE2_LIST_PROJECTION_MAP.put("_id", "_id");
        CTSDBTABLE2_LIST_PROJECTION_MAP.put("key", "key");
        CTSDBTABLE2_LIST_PROJECTION_MAP.put("value", "value");
    }
}
