/*
 *
 * Copyright 2020 gRPC authors.
 *
 * Licensed 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 grpcutil

import (
	
	
)

const maxTimeoutValue int64 = 100000000 - 1

// div does integer division and round-up the result. Note that this is
// equivalent to (d+r-1)/r but has less chance to overflow.
func (,  time.Duration) int64 {
	if % > 0 {
		return int64(/ + 1)
	}
	return int64( / )
}

// EncodeDuration encodes the duration to the format grpc-timeout header
// accepts.
//
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests
func ( time.Duration) string {
	// TODO: This is simplistic and not bandwidth efficient. Improve it.
	if  <= 0 {
		return "0n"
	}
	if  := div(, time.Nanosecond);  <= maxTimeoutValue {
		return strconv.FormatInt(, 10) + "n"
	}
	if  := div(, time.Microsecond);  <= maxTimeoutValue {
		return strconv.FormatInt(, 10) + "u"
	}
	if  := div(, time.Millisecond);  <= maxTimeoutValue {
		return strconv.FormatInt(, 10) + "m"
	}
	if  := div(, time.Second);  <= maxTimeoutValue {
		return strconv.FormatInt(, 10) + "S"
	}
	if  := div(, time.Minute);  <= maxTimeoutValue {
		return strconv.FormatInt(, 10) + "M"
	}
	// Note that maxTimeoutValue * time.Hour > MaxInt64.
	return strconv.FormatInt(div(, time.Hour), 10) + "H"
}