/*
 *
 *    Copyright (c) 2015-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
 *
 * @brief
 *   Enums, types, and tags used in Weave Event Logging.
 *
 */

#ifndef _WEAVE_DATA_MANAGEMENT_EVENT_LOGGING_TAGS_CURRENT_H
#define _WEAVE_DATA_MANAGEMENT_EVENT_LOGGING_TAGS_CURRENT_H

namespace nl {
namespace Weave {
namespace Profiles {
namespace WeaveMakeManagedNamespaceIdentifier(DataManagement, kWeaveManagedNamespaceDesignation_Current) {

// Tags used in LoggingConfiguration

/**
 * @brief
 *   Logging Settings tags
 */
enum {
    /**
     * Current logging importance, the value is of type ImportanceType.
     */
    kTag_CurrentImportance = 1,
    /**
     * Time, in UTC seconds when the current elevated logging
     * settings revert to the default values.
     */
    kTag_ImportanceExpiration,
    /**
     * Minimal duration, in seconds, between automatically
     * triggered log upload attempts.
     */
    kTag_MinimumLogUploadInterval,
    /**
     * Maximal duration, in seconds, between automatically
     * triggered log upload attempts.
     */
    kTag_MaximumLogUploadInterval,
    /**
     * A URL denoting the destination of the log upload.
     */
    kTag_LoggingDestination,
    /**
     * An optional array selectively mapping chosen profiles onto
     * the higher logging levels. Each element in array takes a
     * form (profile,path,loggingimportance) to selectively
     * elevate the logging from a subset of the system.  The
     * elevated profile logging priority is only of significance
     * when the logging priority exceeds that of the
     * currentImportance and is the subject to the same expiration
     * time as the currentImportance.
     */
    kTag_TraitLoggingImportance
};


// tags for the logging capabilities

/**
 * @brief
 *   Tags for logging capabilities
 */
enum {
    kTag_SupportedLogTransports      = 1, //< An array of supported log transport mechanisms
    kTag_SupportsStreaming           = 2, //< A boolean indicating whether the device supports streaming logs
    kTag_SupportsNonVolatileStorage  = 3, //< A boolean indicating whether the device supports nonvolatile log storage
    kTag_SupportsPerTraitVerbosity   = 4, //< A boolean indicating whether the device supports per-trait verbosity settings
    kTag_LoggingVolume               = 5, //< A 32-bit unsigned integer describing the expected logging volume in kB/day
    kTag_LogBufferingCapacity        = 6  //< A 32-bit unsigned integer describing the log buffering capacity in kB
};


/**
 * @brief
 *   Tags for event metadata.  For complete semantics of the tag values, see the Event Design Specification.
 */
enum {
    // public tags for event description

    // The next three values form the event key

    kTag_EventSource                 = 1, //< NodeID of the device that generated the event.
    kTag_EventImportance             = 2, //< Importance of the event.
    kTag_EventID                     = 3, //< Sequence number of event, expressed as a 64-bit unsigned quantity.  Must be sequential, jumps in the sequence indicate event gaps.

    // The next two values form a key to the related event, our mechanism for event grouping.

    // Leaving space for kTag_RelatedEventSource: we know that it is
    // hard to make this work in the general case, related event IDs
    // can arise from a causal event ordering; the causal event
    // ordering eliminates (by construction) the main challenges posed
    // by events from different sources.  Furthermore, data
    // relationships are easier when the key and the reference are the
    // same.

    kTag_RelatedEventImportance      = 10, //< Optional.  Importance of the related event. If omitted, the value is equal to the value of kTag_EventImportance.
    kTag_RelatedEventID              = 11, //< Optional.  ID of an Event that this event is related to.  If omitted, the value is equal to the value of kTag_EventID.


    kTag_EventUTCTimestamp           = 12, //< Optional. UTC Timestamp of the event in milliseconds.
    kTag_EventSystemTimestamp        = 13, //< Optional. System Timestamp of the event in milliseconds.


    // The next three values are analogous to the values within WDM RootSection.

    kTag_EventResourceID             = 14, //< Optional. The value is the ID of the resource that the event pertains to.  When omitted, the value is the same as the value of the kTag_EventSource
    kTag_EventTraitProfileID         = 15, //< Mandatory. 32-bit unsigned integer that is equal to the ProfileID of the trait.
    kTag_EventTraitInstanceID        = 16, //< Optional, the instance of the trait that generated the event.
    kTag_EventType                   = 17, //< Mandatory.  16-bit unsigned integer that is equal to the wdl.event.id for this type of event.

// Weave Event internal tags. Only relevant to entities that need to
// parse out the internal Weave event representation
    kTag_EventDeltaUTCTime           = 30, //< WDM internal tag, time difference from the previous event in the encoding

    kTag_EventDeltaSystemTime        = 31, //< WDM internal tag, time difference from the previous event in the encoding

    kTag_EventData                   = 50, //< Optional.  Event data itself.  If empty, it defaults to an empty structure.

};

// Tags for the debug trait

/**
 * @brief
 *   Profile definitions for the debug trait
 */
enum {
    kWeaveProfile_NestDebug = 0x235a0010,
};

/**
 * @brief
 *   Event types for the Nest Debug trait
 */

enum {
    kNestDebug_StringLogEntryEvent       = 1, //< An event for freeform string debug message.
    kNestDebug_TokenizedLogEntryEvent    = 2, //< An event for tokenized debug message.
    kNestDebug_TokenizedHeaderEntryEvent = 3  //< An event for conveying the tokenized header information.
};

/**
 * @brief
 *  Tags for the #kNestDebug_StringLogEntryEvent
 */
enum {
    kTag_Region  = 1, //< An 32-bit unsigned indicating the log region, i.e. the module to which the log message pertains.
    kTag_Message = 2  //< A string containing the actual debug message.
};

/**
 * @brief
 *  Tags for the #kNestDebug_TokenizedLogEntryEvent
 */
enum {
    kTag_Token = 1, //< A 32-bit unsigned value corresponding to the token.
    kTag_Args  = 2  //< An array of arguments to be sent along with the token message.
};

} // namespace WeaveMakeManagedNamespaceIdentifier(DataManagement, kWeaveManagedNamespaceDesignation_Current)
} // namespace Profiles
} // namespace Weave
} // namespace nl

#endif //_WEAVE_DATA_MANAGEMENT_EVENT_LOGGING_TAGS_CURRENT_H
