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

require "dorian/arguments"
require "dorian/to_struct"
require "json"

parsed = Dorian::Arguments.parse(version: { alias: :v }, help: { alias: :h })

abort parsed.help if parsed.options.help

if parsed.options.version
  abort File.read(File.expand_path("../VERSION", __dir__))
end

inputs = parsed.files.map { |file| File.read(file) }
inputs = [$stdin.each_line.to_a.map(&:strip).join("\n")] if inputs.empty?

inputs.each do |input|
  json = JSON.parse(input)

  if json.is_a?(Hash)
    result =
      json.to_h do |key, value|
        it = { key.dup => value.dup }.to_deep_struct
        eval(parsed.arguments.join(" "))
        it.from_deep_struct.to_a.first
      end
  elsif json.is_a?(Array)
    result =
      json.map do |it|
        it = it.dup.to_deep_struct
        eval(parsed.arguments.join(" "))
        it.from_deep_struct
      end
  else
    it = json.dup.to_deep_struct
    eval(parsed.arguments.join(" "))
    result = it.from_deep_struct
  end

  puts JSON.pretty_generate(result)
end
