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

import java.net.URI;

/**
 * Class to represent the layout and metadata of the zookeeper-based log metadata
 */
public class LogMetadata {

    protected static String getLogComponentPath(URI uri, String logName, String logIdentifier, String component) {
        return String.format("%s/%s/%s%s", uri.getPath(), logName, logIdentifier, component);
    }

    /**
     * Get the top stream path for a given log.
     *
     * @param uri namespace to store the log
     * @param logName name of the log
     * @return top stream path
     */
    public static String getLogStreamPath(URI uri, String logName) {
        return String.format("%s/%s", uri.getPath(), logName);
    }

    /**
     * Get the log root path for a given log.
     *
     * @param uri
     *          namespace to store the log
     * @param logName
     *          name of the log
     * @param logIdentifier
     *          identifier of the log
     * @return log root path
     */
    public static String getLogRootPath(URI uri, String logName, String logIdentifier) {
        return getLogComponentPath(uri, logName, logIdentifier, "");
    }

    /**
     * Get the logsegments root path for a given log.
     *
     * @param uri
     *          namespace to store the log
     * @param logName
     *          name of the log
     * @param logIdentifier
     *          identifier of the log
     * @return logsegments root path
     */
    public static String getLogSegmentsPath(URI uri, String logName, String logIdentifier) {
        return getLogComponentPath(uri, logName, logIdentifier, LOGSEGMENTS_PATH);
    }

    public static final int LAYOUT_VERSION = -1;
    public final static String LOGSEGMENTS_PATH = "/ledgers";
    public final static String VERSION_PATH = "/version";
    // writer znodes
    public final static String MAX_TXID_PATH = "/maxtxid";
    public final static String LOCK_PATH = "/lock";
    public final static String ALLOCATION_PATH = "/allocation";
    // reader znodes
    public final static String READ_LOCK_PATH = "/readLock";

    protected final URI uri;
    protected final String logName;
    protected final String logIdentifier;

    // Root path of the log
    protected final String logRootPath;
    // Components
    protected final String logSegmentsPath;
    protected final String lockPath;
    protected final String maxTxIdPath;
    protected final String allocationPath;

    /**
     * metadata representation of a log
     *
     * @param uri
     *          namespace to store the log
     * @param logName
     *          name of the log
     * @param logIdentifier
     *          identifier of the log
     */
    protected LogMetadata(URI uri,
                          String logName,
                          String logIdentifier) {
        this.uri = uri;
        this.logName = logName;
        this.logIdentifier = logIdentifier;
        this.logRootPath = getLogRootPath(uri, logName, logIdentifier);
        this.logSegmentsPath = logRootPath + LOGSEGMENTS_PATH;
        this.lockPath = logRootPath + LOCK_PATH;
        this.maxTxIdPath = logRootPath + MAX_TXID_PATH;
        this.allocationPath = logRootPath + ALLOCATION_PATH;
    }

    public URI getUri() {
        return uri;
    }

    public String getLogName() {
        return logName;
    }

    /**
     * Get the root path of the log.
     *
     * @return root path of the log.
     */
    public String getLogRootPath() {
        return logRootPath;
    }

    /**
     * Get the root path for log segments.
     *
     * @return root path for log segments
     */
    public String getLogSegmentsPath() {
        return this.logSegmentsPath;
    }

    /**
     * Get the path for a log segment of the log.
     *
     * @param segmentName
     *          segment name
     * @return path for the log segment
     */
    public String getLogSegmentPath(String segmentName) {
        return this.logSegmentsPath + "/" + segmentName;
    }

    public String getLockPath() {
        return lockPath;
    }

    public String getMaxTxIdPath() {
        return maxTxIdPath;
    }

    public String getAllocationPath() {
        return allocationPath;
    }

    /**
     * Get the fully qualified name of the log.
     *
     * @return fully qualified name
     */
    public String getFullyQualifiedName() {
        return String.format("%s:%s", logName, logIdentifier);
    }

}
