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

using System;
using Apache.Rocketmq.V2;
using Proto = Apache.Rocketmq.V2;

namespace Org.Apache.Rocketmq
{
    /// <summary>
    /// Internal interface for retry policy.
    /// </summary>
    public interface IRetryPolicy
    {
        /// <summary>
        /// Get the max attempt times for retry.
        /// </summary>
        /// <returns>The max attempt times.</returns>
        int GetMaxAttempts();

        /// <summary>
        /// Get await time after current attempts, the attempt index starts at 1.
        /// </summary>
        /// <param name="attempt">Current attempt.</param>
        /// <returns>Await time.</returns>
        TimeSpan GetNextAttemptDelay(int attempt);

        /// <summary>
        /// Convert to protobuf.
        /// </summary>
        /// <returns></returns>
        RetryPolicy ToProtobuf();

        /// <summary>
        /// Inherit backoff of retry policy.
        /// </summary>
        /// <param name="retryPolicy"></param>
        /// <returns></returns>
        IRetryPolicy InheritBackoff(RetryPolicy retryPolicy);
    }
}