/*
 * Copyright (C) 2010 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.android.providers.contacts;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.ContactsContract.CommonDataKinds.BaseTypes;
import android.text.TextUtils;
import com.android.providers.contacts.aggregation.AbstractContactAggregator;

/**
 * Superclass for data row handlers that deal with types (e.g. Home, Work, Other) and
 * labels, which are custom types.
 */
public class DataRowHandlerForCommonDataKind extends DataRowHandler {

    private final String mTypeColumn;
    private final String mLabelColumn;

    public DataRowHandlerForCommonDataKind(Context context, ContactsDatabaseHelper dbHelper,
            AbstractContactAggregator aggregator, String mimetype, String typeColumn,
            String labelColumn) {
        super(context, dbHelper, aggregator, mimetype);
        mTypeColumn = typeColumn;
        mLabelColumn = labelColumn;
    }

    @Override
    public long insert(SQLiteDatabase db, TransactionContext txContext, long rawContactId,
            ContentValues values) {
        enforceTypeAndLabel(values);
        return super.insert(db, txContext, rawContactId, values);
    }

    @Override
    public boolean update(SQLiteDatabase db, TransactionContext txContext, ContentValues values,
            Cursor c, boolean callerIsSyncAdapter, boolean callerIsMetadataSyncAdapter) {
        final long dataId = c.getLong(DataUpdateQuery._ID);
        final ContentValues augmented = getAugmentedValues(db, dataId, values);
        if (augmented == null) {        // No change
            return false;
        }
        enforceTypeAndLabel(augmented);
        return super.update(db, txContext, values, c, callerIsSyncAdapter,
                callerIsMetadataSyncAdapter);
    }

    /**
     * If the given {@link ContentValues} defines {@link #mTypeColumn},
     * enforce that {@link #mLabelColumn} only appears when type is
     * {@link BaseTypes#TYPE_CUSTOM}. Exception is thrown otherwise.
     */
    private void enforceTypeAndLabel(ContentValues augmented) {
        final boolean hasType = !TextUtils.isEmpty(augmented.getAsString(mTypeColumn));
        final boolean hasLabel = !TextUtils.isEmpty(augmented.getAsString(mLabelColumn));

        if (hasLabel && !hasType) {
            // When label exists, assert that some type is defined
            throw new IllegalArgumentException(mTypeColumn + " must be specified when "
                    + mLabelColumn + " is defined.");
        }
    }

    @Override
    public boolean hasSearchableData() {
        return true;
    }
}
