/// @addtogroup profiler Profiler
/// @brief Functions to instrument nwscript code.
/// @remark These functions are for advanced users.
/// @{
/// @file nwnx_profiler.nss
#include "nwnx"

const string NWNX_Profiler = "NWNX_Profiler"; ///< @private

/// @brief Push a timing metric scope - note that every push must be matched by a corresponding pop.
///
/// A timing metric contains the following information.
///  ```c
///  {
///    metricName: [name], // Mandatory, from user code
///    metricFields: { time, nanoseconds }, // Automatically captured by the push/pop pair
///    metricTags: { [tag0_tag], [tag0_value] } // Optional, from user code, can be used to
///                                                filter metrics based on some category or,
///                                                constant e.g. objectType or area
///  }
///  ```
///
/// If you don't understand how this works and you wish to use it, you should research
/// the Metrics system (see Metrics.hpp) as well as googling about how InfluxDB stores metrics.
///
/// @note It's possible to have more than one tag pair per metric, It is just limited
/// to one arbitrarily here. You can edit the prototype to include more and the C++
/// code will cope with it correctly.
/// @param name The name to use for your metric.
/// @param tag0_tag An optional tag to filter your metrics.
/// @param tag0_value The tag's value for which to filter.
void NWNX_Profiler_PushPerfScope(string name, string tag0_tag = "", string tag0_value = "");

/// @brief Pops a timing metric.
/// @remark A metric must already be pushed.
void NWNX_Profiler_PopPerfScope();

/// @}

void NWNX_Profiler_PushPerfScope(string name, string tag0_tag = "", string tag0_value = "")
{
    string sFunc = "PushPerfScope";

    NWNX_PushArgumentString(name);

    if (tag0_value != "" && tag0_tag != "")
    {
        NWNX_PushArgumentString(tag0_value);
        NWNX_PushArgumentString(tag0_tag);
    }

    NWNX_CallFunction(NWNX_Profiler, sFunc);
}

void NWNX_Profiler_PopPerfScope()
{
    string sFunc = "PopPerfScope";

    NWNX_CallFunction(NWNX_Profiler, sFunc);
}