#pragma once

#include "profiler.h"

struct ScopeProfiler {
	const char *name;
	bool enabled = true;

	ScopeProfiler(const char *name) : name(name) { profile_start(name); }

	~ScopeProfiler() { Stop(); }

	ScopeProfiler(const ScopeProfiler &) = delete;
	ScopeProfiler(ScopeProfiler &&other)
		: name(other.name),
		  enabled(other.enabled)
	{
		other.enabled = false;
	}

	ScopeProfiler &operator=(const ScopeProfiler &) = delete;
	ScopeProfiler &operator=(ScopeProfiler &&other) = delete;

	void Stop()
	{
		if (!enabled)
			return;

		profile_end(name);
		enabled = false;
	}
};

#ifndef NO_PROFILER_MACROS

#define ScopeProfiler_NameConcatImpl(x, y) x##y
#define ScopeProfiler_NameConcat(x, y) ScopeProfiler_NameConcatImpl(x, y)

#ifdef __COUNTER__
#define ScopeProfiler_Name(x) ScopeProfiler_NameConcat(x, __COUNTER__)
#else
#define ScopeProfiler_Name(x) ScopeProfiler_NameConcat(x, __LINE__)
#endif

#define ProfileScope(x)                                 \
	ScopeProfiler ScopeProfiler_Name(SCOPE_PROFILE) \
	{                                               \
		x                                       \
	}

#endif
