/**
 * 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.activemq.openwire.commands;

import org.apache.activemq.openwire.annotations.OpenWireType;
import org.apache.activemq.openwire.annotations.OpenWireExtension;
import org.apache.activemq.openwire.annotations.OpenWireProperty;

/**
 * A general purpose replay command for some kind of producer where ranges of
 * messages are asked to be replayed. This command is typically used over a
 * non-reliable transport such as UDP or multicast but could also be used on
 * TCP/IP if a socket has been re-established.
 *
 * @openwire:marshaller code="65"
 */
@OpenWireType(typeCode = 65)
public class ReplayCommand extends BaseCommand {

    public static final byte DATA_STRUCTURE_TYPE = CommandTypes.REPLAY;

    @OpenWireProperty(version = 1, sequence = 1)
    private int firstNakNumber;

    @OpenWireProperty(version = 1, sequence = 2)
    private int lastNakNumber;

    @OpenWireExtension(serialized = true)
    private String producerId;

    @OpenWireExtension(serialized = true)
    private int firstAckNumber;

    @OpenWireExtension(serialized = true)
    private int lastAckNumber;

    public ReplayCommand() {
    }

    @Override
    public byte getDataStructureType() {
        return DATA_STRUCTURE_TYPE;
    }

    public String getProducerId() {
        return producerId;
    }

    /**
     * Is used to uniquely identify the producer of the sequence
     */
    public void setProducerId(String producerId) {
        this.producerId = producerId;
    }

    public int getFirstAckNumber() {
        return firstAckNumber;
    }

    /**
     * Is used to specify the first sequence number being acknowledged as delivered on the transport
     * so that it can be removed from cache
     */
    public void setFirstAckNumber(int firstSequenceNumber) {
        this.firstAckNumber = firstSequenceNumber;
    }

    public int getLastAckNumber() {
        return lastAckNumber;
    }

    /**
     * Is used to specify the last sequence number being acknowledged as delivered on the transport
     * so that it can be removed from cache
     */
    public void setLastAckNumber(int lastSequenceNumber) {
        this.lastAckNumber = lastSequenceNumber;
    }

    @Override
    public Response visit(CommandVisitor visitor) throws Exception {
        return null;
    }

    /**
     * Is used to specify the first sequence number to be replayed
     *
     * @openwire:property version=1
     */
    public int getFirstNakNumber() {
        return firstNakNumber;
    }

    public void setFirstNakNumber(int firstNakNumber) {
        this.firstNakNumber = firstNakNumber;
    }

    /**
     * Is used to specify the last sequence number to be replayed
     *
     * @openwire:property version=1
     */
    public int getLastNakNumber() {
        return lastNakNumber;
    }

    public void setLastNakNumber(int lastNakNumber) {
        this.lastNakNumber = lastNakNumber;
    }

    @Override
    public String toString() {
        return "ReplayCommand {commandId = " + getCommandId() + ", firstNakNumber = " + getFirstNakNumber() + ", lastNakNumber = " + getLastNakNumber() + "}";
    }
}
