#pragma once // ensure that a given header file is included only once in a
             // single compilation unit

#include "arena.h"
#include "base.h"
#include "lf_mpmc.h"

#include "arena.c"

// xxhash include
#define XXH_INLINE_ALL
#include "xxh_x86dispatch.h"

// ----------------------------- Config -------------------------------------
#define FILE_HASHES_TXT "file_hashes.txt"
#define HASH_STRLEN 33 // 128-bit hex (32 chars) + null
#define MAX_PATHLEN 4096
#define READ_BLOCK (64 * 1024) // 64KB blocks

// ----------------------------- Data types ---------------------------------
// Timer
typedef struct {
  LARGE_INTEGER start;
  LARGE_INTEGER end;
} HiResTimer;

static LARGE_INTEGER g_qpc_freq;

// File entry
typedef struct FileEntry {
  char *path;

  uint64_t size_bytes;
  uint64_t created_time;  // epoch
  uint64_t modified_time; // epoch seconds
  char owner[128];        // resolved owner name
} FileEntry;

// Threads context
typedef struct {
  u8 num_threads;

  mem_arena *path_arena;
  mem_arena *meta_arena;

  MPMCQueue *dir_queue;
  MPMCQueue *file_queue;
} ScannerContext;

typedef struct {
  mem_arena *arena;
  MPMCQueue *file_queue;
} WorkerContext;
