/**
 * 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 com.twitter.distributedlog.logsegment;

import com.google.common.annotations.Beta;
import com.twitter.distributedlog.LogSegmentMetadata;
import com.twitter.distributedlog.callback.LogSegmentNamesListener;
import com.twitter.distributedlog.metadata.LogMetadata;
import com.twitter.distributedlog.metadata.LogMetadataForWriter;
import com.twitter.distributedlog.util.Transaction;
import com.twitter.distributedlog.util.Transaction.OpListener;
import com.twitter.util.Future;
import org.apache.bookkeeper.versioning.Version;
import org.apache.bookkeeper.versioning.Versioned;

import java.io.Closeable;
import java.util.List;

/**
 * Interface for log segment metadata store. All operations that modify log segments should
 * be executed under a {@link Transaction}.
 */
@Beta
public interface LogSegmentMetadataStore extends Closeable {

    /**
     * Start the transaction on changing log segment metadata store.
     *
     * @return transaction of the log segment metadata store.
     */
    Transaction<Object> transaction();

    // The reason to keep storing log segment sequence number & log record transaction id
    // in this log segment metadata store interface is to share the transaction that used
    // to start/complete log segment. It is a bit hard to separate them out right now.

    /**
     * Store the maximum log segment sequence number on <code>path</code>.
     *
     * @param txn
     *          transaction to execute for storing log segment sequence number.
     * @param logMetadata
     *          metadata of the log stream
     * @param sequenceNumber
     *          log segment sequence number to store
     * @param listener
     *          listener on the result to this operation
     */
    void storeMaxLogSegmentSequenceNumber(Transaction<Object> txn,
                                          LogMetadata logMetadata,
                                          Versioned<Long> sequenceNumber,
                                          OpListener<Version> listener);

    /**
     * Store the maximum transaction id for <code>path</code>
     *
     * @param txn
     *          transaction to execute for storing transaction id
     * @param logMetadata
     *          metadata of the log stream
     * @param transactionId
     *          transaction id to store
     * @param listener
     *          listener on the result to this operation
     */
    void storeMaxTxnId(Transaction<Object> txn,
                       LogMetadataForWriter logMetadata,
                       Versioned<Long> transactionId,
                       OpListener<Version> listener);

    /**
     * Create a log segment <code>segment</code> under transaction <code>txn</code>.
     *
     * NOTE: this operation shouldn't be a blocking call. and it shouldn't execute the operation
     *       immediately. the operation should be executed via {@link Transaction#execute()}
     *
     * @param txn
     *          transaction to execute for this operation
     * @param segment
     *          segment to create
     * @param opListener
     *          the listener on the operation result
     */
    void createLogSegment(Transaction<Object> txn,
                          LogSegmentMetadata segment,
                          OpListener<Void> opListener);

    /**
     * Delete a log segment <code>segment</code> under transaction <code>txn</code>.
     *
     * NOTE: this operation shouldn't be a blocking call. and it shouldn't execute the operation
     *       immediately. the operation should be executed via {@link Transaction#execute()}
     *
     * @param txn
     *          transaction to execute for this operation
     * @param segment
     *          segment to delete
     */
    void deleteLogSegment(Transaction<Object> txn,
                          LogSegmentMetadata segment,
                          OpListener<Void> opListener);

    /**
     * Update a log segment <code>segment</code> under transaction <code>txn</code>.
     *
     * NOTE: this operation shouldn't be a blocking call. and it shouldn't execute the operation
     *       immediately. the operation should be executed via {@link Transaction#execute()}
     *
     * @param txn
     *          transaction to execute for this operation
     * @param segment
     *          segment to update
     */
    void updateLogSegment(Transaction<Object> txn, LogSegmentMetadata segment);

    /**
     * Retrieve the log segment associated <code>path</code>.
     *
     * @param logSegmentPath
     *          path to store log segment metadata
     * @return future of the retrieved log segment metadata
     */
    Future<LogSegmentMetadata> getLogSegment(String logSegmentPath);

    /**
     * Retrieve the list of log segments under <code>logSegmentsPath</code> and register a <i>listener</i>
     * for subsequent changes for the list of log segments.
     *
     * @param logSegmentsPath
     *          path to store list of log segments
     * @param listener
     *          log segment listener on log segment changes
     * @return future of the retrieved list of log segment names
     */
    Future<Versioned<List<String>>> getLogSegmentNames(String logSegmentsPath,
                                                       LogSegmentNamesListener listener);

    /**
     * Unregister a log segment <code>listener</code> on log segment changes under <code>logSegmentsPath</code>.
     *
     * @param logSegmentsPath
     *          log segments path
     * @param listener
     *          log segment listener on log segment changes
     */
    void unregisterLogSegmentListener(String logSegmentsPath,
                                      LogSegmentNamesListener listener);
}
