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

import com.google.common.annotations.Beta;
import org.apache.distributedlog.LogSegmentMetadata;
import org.apache.distributedlog.callback.LogSegmentNamesListener;
import org.apache.distributedlog.metadata.LogMetadata;
import org.apache.distributedlog.metadata.LogMetadataForWriter;
import org.apache.distributedlog.util.Transaction;
import org.apache.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);
}
