#include "config.h"

#include "trace.h"

#include "common.h"
#include "flog.h"
#include "parser.h"

static const wcstring VAR_fish_trace = L"fish_trace";

bool trace_enabled(const parser_t &parser) {
    auto &ld = parser.libdata();
    if (ld.suppress_fish_trace) return false;
    // TODO: this variable lookup is somewhat expensive, consider how to make this cheaper.
    return !parser.vars().get(VAR_fish_trace).missing_or_empty();
}

/// Trace an "argv": a list of arguments where the first is the command.
void trace_argv(const parser_t &parser, const wchar_t *command, const wcstring_list_t &argv) {
    // Format into a string to prevent interleaving with flog in other threads.
    // Add the + prefix.
    wcstring trace_text(parser.blocks().size(), '+');

    if (command && command[0]) {
        trace_text.push_back(L' ');
        trace_text.append(command);
    }
    for (const wcstring &arg : argv) {
        trace_text.push_back(L' ');
        trace_text.append(escape_string(arg, ESCAPE_ALL));
    }
    trace_text.push_back('\n');
    log_extra_to_flog_file(trace_text);
}

void trace_if_enabled(const parser_t &parser, const wchar_t *command, const wcstring_list_t &argv) {
    if (trace_enabled(parser)) trace_argv(parser, command, argv);
}
