/*
 *
 *    Copyright (c) 2013-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    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.
 */

/**
 *    @file
 *      This file contains definitions for working with Weave TLV types.
 *
 */

#ifndef WEAVETLVTYPES_H_
#define WEAVETLVTYPES_H_

namespace nl {
namespace Weave {
namespace TLV {

/**
 * An enumeration identifying the type of a TLV element.
 */
enum TLVType
{
    kTLVType_NotSpecified                       = -1,
    kTLVType_UnknownContainer                   = -2,

    kTLVType_SignedInteger                      = 0x00,
    kTLVType_UnsignedInteger                    = 0x04,
    kTLVType_Boolean                            = 0x08,
    kTLVType_FloatingPointNumber                = 0x0A,
    kTLVType_UTF8String                         = 0x0C,
    kTLVType_ByteString                         = 0x10,
    kTLVType_Null                               = 0x14,
    kTLVType_Structure                          = 0x15,
    kTLVType_Array                              = 0x16,
    kTLVType_Path                               = 0x17
};

// TODO: Move to private namespace
enum TLVElementType
{
    kTLVElementType_NotSpecified                = -1,
    kTLVElementType_Int8                        = 0x00,
    kTLVElementType_Int16                       = 0x01,
    kTLVElementType_Int32                       = 0x02,
    kTLVElementType_Int64                       = 0x03,
    kTLVElementType_UInt8                       = 0x04,
    kTLVElementType_UInt16                      = 0x05,
    kTLVElementType_UInt32                      = 0x06,
    kTLVElementType_UInt64                      = 0x07,
    kTLVElementType_BooleanFalse                = 0x08,
    kTLVElementType_BooleanTrue                 = 0x09,
    kTLVElementType_FloatingPointNumber32       = 0x0A,
    kTLVElementType_FloatingPointNumber64       = 0x0B,
    kTLVElementType_UTF8String_1ByteLength      = 0x0C,
    kTLVElementType_UTF8String_2ByteLength      = 0x0D,
    kTLVElementType_UTF8String_4ByteLength      = 0x0E,
    kTLVElementType_UTF8String_8ByteLength      = 0x0F,
    kTLVElementType_ByteString_1ByteLength      = 0x10,
    kTLVElementType_ByteString_2ByteLength      = 0x11,
    kTLVElementType_ByteString_4ByteLength      = 0x12,
    kTLVElementType_ByteString_8ByteLength      = 0x13,
    kTLVElementType_Null                        = 0x14,
    kTLVElementType_Structure                   = 0x15,
    kTLVElementType_Array                       = 0x16,
    kTLVElementType_Path                        = 0x17,
    kTLVElementType_EndOfContainer              = 0x18
};

// TODO: Move to private namespace
enum TLVFieldSize
{
    kTLVFieldSize_0Byte                         = -1,
    kTLVFieldSize_1Byte                         = 0,
    kTLVFieldSize_2Byte                         = 1,
    kTLVFieldSize_4Byte                         = 2,
    kTLVFieldSize_8Byte                         = 3
};

// TODO: Move to private namespace
enum
{
    kTLVTypeMask                                = 0x1F,
    kTLVTypeSizeMask                            = 0x03
};

/**
 * Returns true if the specified TLV type is valid.
 *
 * @return @p true if the specified TLV type is valid; otherwise @p false.
 */
inline bool IsValidTLVType(uint8_t type)
{
    return type <= kTLVElementType_EndOfContainer;
}

/**
 * Returns true if the specified TLV type implies the presence of an associated value field.
 *
 * @return @p true if the specified TLV type implies the presence of an associated value field; otherwise @p false.
 */
inline bool TLVTypeHasValue(uint8_t type)
{
    return (type <= kTLVElementType_UInt64 ||
            (type >= kTLVElementType_FloatingPointNumber32 && type <= kTLVElementType_ByteString_8ByteLength));
}

/**
 * Returns true if the specified TLV type implies the presence of an associated length field.
 *
 * @return @p true if the specified TLV type implies the presence of an associated length field; otherwise @p false.
 */
inline bool TLVTypeHasLength(uint8_t type)
{
    return type >= kTLVElementType_UTF8String_1ByteLength && type <= kTLVElementType_ByteString_8ByteLength;
}

/**
 * Returns true if the specified TLV type is a container.
 *
 * @return @p true if the specified TLV type is a container; otherwise @p false.
 */
inline bool TLVTypeIsContainer(uint8_t type)
{
    return type >= kTLVElementType_Structure && type <= kTLVElementType_Path;
}

/**
 * Returns true if the specified TLV type is a UTF8 or byte string.
 *
 * @return @p true if the specified TLV type is a UTF8 or byte string; otherwise @p false.
 */
inline bool TLVTypeIsString(uint8_t type)
{
    return type >= kTLVElementType_UTF8String_1ByteLength && type <= kTLVElementType_ByteString_8ByteLength;
}

// TODO: move to private namespace
inline TLVFieldSize GetTLVFieldSize(uint8_t type)
{
    if (TLVTypeHasValue(type))
        return (TLVFieldSize)(type & kTLVTypeSizeMask);
    else
        return kTLVFieldSize_0Byte;
}

// TODO: move to private namespace
inline uint8_t TLVFieldSizeToBytes(TLVFieldSize fieldSize)
{
    return (fieldSize != kTLVFieldSize_0Byte) ? (1 << fieldSize) : 0;
}

} // namespace TLV
} // namespace Weave
} // namespace nl



#endif /* WEAVETLVTYPES_H_ */
