// Copyright 2007-2026 David Robillard <d@drobilla.net>
// SPDX-License-Identifier: ISC

#ifndef JALV_LOG_H
#define JALV_LOG_H

#include "attributes.h"
#include "urids.h"

#include <lv2/log/log.h>
#include <lv2/urid/urid.h>

#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>

#ifdef __GNUC__
#  define JALV_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1)))
#else
#  define JALV_LOG_FUNC(fmt, arg1)
#endif

// String and log utilities
JALV_BEGIN_DECLS

typedef enum {
  JALV_LOG_ERR     = 3,
  JALV_LOG_WARNING = 4,
  JALV_LOG_INFO    = 6,
  JALV_LOG_DEBUG   = 7,
} JalvLogLevel;

typedef JALV_LOG_FUNC(3, 0) int (*JalvLogSink)(void*        handle,
                                               JalvLogLevel level,
                                               const char*  fmt,
                                               va_list      args);

typedef struct {
  JalvURIDs*  urids;
  JalvLogSink sink;
  void*       sink_handle;
  bool        tracing;
} JalvLog;

/// Print a log message to stderr with a GCC-like prefix and color
JALV_LOG_FUNC(3, 4) int
jalv_log(const JalvLog* log, JalvLogLevel level, const char* fmt, ...);

/// LV2 log vprintf function
JALV_LOG_FUNC(3, 0) int
jalv_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap);

/// LV2 log printf function
JALV_LOG_FUNC(3, 4) int
jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...);

/// Write an ANSI escape sequence to set the foreground color
bool
jalv_ansi_start(FILE* stream, int color);

/// Write an ANSI escape sequence to reset the foreground color
void
jalv_ansi_reset(FILE* stream);

JALV_END_DECLS

#endif // JALV_LOG_H
