/*
 * 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.bookkeeper.stream.protocol;

import java.io.Serializable;
import java.util.Comparator;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * A range (at a given revision) of a stream.
 */
@Data(staticConstructor = "of")
@EqualsAndHashCode
public class RangeId implements Comparable<RangeId>, Serializable {

    public static final Comparator<RangeId> COMPARATOR = Comparator.naturalOrder();

    private static final long serialVersionUID = 1704491294262309389L;

    private final long streamId;
    private final long rangeId;

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("range(")
            .append(streamId)
            .append(", ")
            .append(rangeId)
            .append(')');
        return sb.toString();
    }

    @Override
    public int compareTo(RangeId other) {
        int result = Long.compare(streamId, other.streamId);
        if (result == 0) {
            result = Long.compare(rangeId, other.rangeId);
        }
        return result;
    }
}
