/*
 *
 *    Copyright (c) 2016-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.
 */
#ifndef _APPLICATION_KEYS_TRAIT_TAGS_H
#define _APPLICATION_KEYS_TRAIT_TAGS_H

#include <Weave/Profiles/data-management/TraitData.h>

/**
 *   @namespace Schema::Weave::Trait::Auth::ApplicationKeysTrait
 *
 *   @brief
 *     This namespace includes all definitions and interfaces for the Weave
 *     application keys trait.
 */

namespace Schema {
namespace Weave {
namespace Trait {
namespace Auth {
namespace ApplicationKeysTrait {

    /**
     * Epoch key data element tags.
     */
    enum EpochKey {
        //---------------------------------------------------------------------------------------------------------------------------//
        //  Name                                IDL Type                            TLV Type           Optional?       Nullable?     //
        //---------------------------------------------------------------------------------------------------------------------------//

        //
        //  key_id                              uint32                              unsigned int       NO              NO
        //
        kTag_EpochKey_KeyId = 1,

        //
        //  start_time                          google.protobuf.Timestamp           unsigned int       NO              NO
        //                                      (int64 milliseconds)
        kTag_EpochKey_StartTime = 2,

        //
        //  key                                 bytes                               array              NO              NO
        //
        kTag_EpochKey_Key = 3,
    };

    /**
     * Application master key data element tags.
     */
    enum ApplicationMasterKey {
        //---------------------------------------------------------------------------------------------------------------------------//
        //  Name                                IDL Type                            TLV Type           Optional?       Nullable?     //
        //---------------------------------------------------------------------------------------------------------------------------//

        //
        //  application_group_global_id         uint32                              unsigned int       NO              NO
        //
        kTag_ApplicationGroup_GlobalId = 1,

        //
        //  application_group_short_id          uint32                              unsigned int       NO              NO
        //
        kTag_ApplicationGroup_ShortId = 2,

        //
        //  key                                 bytes                               array              NO              NO
        //
        kTag_ApplicationGroup_Key = 3,
    };

} // ApplicationKeysTrait
} // Auth
} // Trait
} // Weave
} // Schema

#endif // _APPLICATION_KEYS_TRAIT_TAGS_H
