/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.cassandra;

import java.nio.ByteBuffer;

import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.db.*;
import org.apache.cassandra.db.rows.*;
import org.apache.cassandra.db.partitions.*;
import org.apache.cassandra.utils.FBUtilities;


/**
 * Convenience object to create updates to a single partition.
 *
 * This is not unlike RowUpdateBuilder except that it allows to create update to multiple rows more easily.
 * It is also aimed at unit tests so favor convenience over efficiency.
 */
public class UpdateBuilder
{
    private final PartitionUpdate.SimpleBuilder updateBuilder;
    private Row.SimpleBuilder currentRow;

    private UpdateBuilder(PartitionUpdate.SimpleBuilder updateBuilder)
    {
        this.updateBuilder = updateBuilder;
    }

    public static UpdateBuilder create(CFMetaData metadata, Object... partitionKey)
    {
        return new UpdateBuilder(PartitionUpdate.simpleBuilder(metadata, partitionKey));
    }

    public UpdateBuilder withTimestamp(long timestamp)
    {
        updateBuilder.timestamp(timestamp);
        if (currentRow != null)
            currentRow.timestamp(timestamp);
        return this;
    }

    public UpdateBuilder newRow(Object... clustering)
    {
        currentRow = updateBuilder.row(clustering);
        return this;
    }

    public UpdateBuilder add(String column, Object value)
    {
        assert currentRow != null;
        currentRow.add(column, value);
        return this;
    }

    public PartitionUpdate build()
    {
        return updateBuilder.build();
    }

    public IMutation makeMutation()
    {
        Mutation m = updateBuilder.buildAsMutation();
        return updateBuilder.metadata().isCounter()
             ? new CounterMutation(m, ConsistencyLevel.ONE)
             : m;
    }

    public void apply()
    {
        makeMutation().apply();
    }

    public void applyUnsafe()
    {
        assert !updateBuilder.metadata().isCounter() : "Counters have currently no applyUnsafe() option";
        updateBuilder.buildAsMutation().applyUnsafe();
    }
}
