#!/usr/bin/env ruby
# frozen_string_literal: true

# SPDX-License-Identifier: GPL-3.0-only
# Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
#
# varuna-emit — append a JSON event to the Varuna engine event log.
#
# Usage:
#   varuna-emit <event_name> [payload_json]
#
# The event log is written to:
#   $XDG_STATE_HOME/varuna/events/engine-events.jsonl
#   (default: ~/.local/state/varuna/events/engine-events.jsonl)
#
# Each line is a JSON object:
#   {"event":"<name>","timestamp":"<iso8601>","session_id":"<sid>","payload":{...}}
#
# Exit codes:
#   0 — event appended
#   1 — missing event name argument
#   2 — payload is not valid JSON
#   3 — event log directory creation failed

require 'json'
require 'fileutils'
require 'time'

EVENT_NAME = ARGV[0]
PAYLOAD_JSON = ARGV[1] || '{}'

if EVENT_NAME.nil? || EVENT_NAME.empty?
  warn 'Usage: varuna-emit <event_name> [payload_json]'
  exit 1
end

payload = begin
  JSON.parse(PAYLOAD_JSON)
rescue JSON::ParserError => e
  warn "varuna-emit: invalid JSON payload: #{e.message}"
  exit 2
end

state_home = ENV.fetch('XDG_STATE_HOME', File.join(Dir.home, '.local', 'state'))
event_log_dir = File.join(state_home, 'varuna', 'events')

begin
  FileUtils.mkdir_p(event_log_dir)
rescue SystemCallError => e
  warn "varuna-emit: cannot create event log dir #{event_log_dir}: #{e.message}"
  exit 3
end

session_id = payload['session_id'] ||
             ENV.fetch('CLAUDE_SESSION_ID', nil) ||
             ENV.fetch('TMPDIR', '')&.then { |t| File.basename(t) }

entry = JSON.generate({
  'event' => EVENT_NAME,
  'timestamp' => Time.now.utc.iso8601(3),
  'session_id' => session_id,
  'payload' => payload
})

event_log_path = File.join(event_log_dir, 'engine-events.jsonl')

File.open(event_log_path, 'a') { |f| f.puts(entry) }
