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

import java.io.Closeable;
import java.io.IOException;
import java.net.URI;
import org.apache.bookkeeper.feature.FeatureProvider;
import org.apache.bookkeeper.stats.StatsLogger;
import org.apache.distributedlog.DistributedLogConfiguration;
import org.apache.distributedlog.acl.AccessControlManager;
import org.apache.distributedlog.api.MetadataAccessor;
import org.apache.distributedlog.api.subscription.SubscriptionsStore;
import org.apache.distributedlog.config.DynamicDistributedLogConfiguration;
import org.apache.distributedlog.exceptions.InvalidStreamNameException;
import org.apache.distributedlog.injector.AsyncFailureInjector;
import org.apache.distributedlog.logsegment.LogSegmentEntryStore;
import org.apache.distributedlog.metadata.LogMetadataStore;
import org.apache.distributedlog.metadata.LogStreamMetadataStore;
import org.apache.distributedlog.util.OrderedScheduler;




/**
 * Manager to manage all the stores required by a namespace.
 */
public interface NamespaceDriver extends Closeable {
    /**
     * Role associated with the store.
     */
    enum Role {
        WRITER,
        READER
    }

    /**
     * Initialize the namespace manager.
     *
     * @param conf distributedlog configuration
     * @param dynConf dynamic distributedlog configuration
     * @param namespace root uri of the namespace
     * @param scheduler ordered scheduler
     * @param featureProvider feature provider
     * @param statsLogger stats logger
     * @param perLogStatsLogger per log stream stats logger
     * @param clientId client id
     * @return namespace manager
     * @throws IOException when failed to initialize the namespace manager
     */
    NamespaceDriver initialize(DistributedLogConfiguration conf,
                               DynamicDistributedLogConfiguration dynConf,
                               URI namespace,
                               OrderedScheduler scheduler,
                               FeatureProvider featureProvider,
                               AsyncFailureInjector failureInjector,
                               StatsLogger statsLogger,
                               StatsLogger perLogStatsLogger,
                               String clientId,
                               int regionId) throws IOException;

    /**
     * Get the scheme of the namespace driver.
     *
     * @return the scheme of the namespace driver.
     */
    String getScheme();

    /**
     * Get the root uri of the namespace driver.
     *
     * @return the root uri of the namespace driver.
     */
    URI getUri();

    /**
     * Retrieve the log {@code metadata store} used by the namespace.
     *
     * @return the log metadata store
     */
    LogMetadataStore getLogMetadataStore();

    /**
     * Retrieve the log stream {@code metadata store} used by the namespace.
     *
     * @param role the role to retrieve the log stream metadata store.
     * @return the log stream metadata store
     */
    LogStreamMetadataStore getLogStreamMetadataStore(Role role);

    /**
     * Retrieve the log segment {@code entry store} used by the namespace.
     *
     * @param role the role to retrieve the log segment entry store.
     * @return the log segment entry store.
     * @throws IOException when failed to open log segment entry store.
     */
    LogSegmentEntryStore getLogSegmentEntryStore(Role role);

    /**
     * Create an access control manager to manage/check acl for logs.
     *
     * @return access control manager for logs under the namespace.
     * @throws IOException
     */
    AccessControlManager getAccessControlManager()
            throws IOException;

    /**
     * Retrieve the metadata accessor for log stream {@code streamName}.
     * (TODO: it is a legacy interface. should remove it if we have metadata of stream.)
     *
     * @param streamName name of log stream.
     * @return metadata accessor for log stream {@code streamName}.
     */
    MetadataAccessor getMetadataAccessor(String streamName)
            throws InvalidStreamNameException, IOException;

    /**
     * Retrieve the subscriptions store for log stream {@code streamName}.
     *
     * @return the subscriptions store for log stream {@code streamName}
     */
    SubscriptionsStore getSubscriptionsStore(String streamName);

}
