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

LKP_SRC = ENV['LKP_SRC'] || File.dirname(File.dirname(File.realpath($PROGRAM_NAME)))

require "#{LKP_SRC}/lib/monitor"
require "#{LKP_SRC}/lib/unit"

require 'optparse'
require 'yaml'

opt_set_key_value = {}
opt_action = {'output' => true}
opt_job = {}
opt_results = []
opt_monitor_url = nil
opt_timeout = 0
opt_stop_query = {}

options = OptionParser.new do |opts|
  opts.banner = 'Usage: monitor [options] <filter>'
  opts.separator '       <filter> like: job_id=1 level=info'
  opts.separator '       monitor logs'
  opts.separator '       use ctrl+c to break'
  opts.separator ''
  opts.separator 'options:'

  opts.on('-u URL', '--url URL',
          'set Message Server API address, default is ws://localhost:20001/filter') do |monitor_url|
    opt_monitor_url = monitor_url
  end

  opts.on('-a action', '--action action', 'set monitor run action, default is output') do |actions|
    opt_action = {}
    actions.split(',').each do |action|
      opt_action[action] = true
    end
  end

  opts.on('-r result_roots', '--results results', 'set monitor result_roots') do |result_roots|
    result_roots.split(',').each do |res|
      opt_results << res
    end
  end
  opts.separator '                                     action: output, output log'
  opts.separator '                                     action: connect, connect to the host when get ip'
  opts.separator '                                     action: stop, exit monitor client when get log'

  opts.on("-f 'KEY: VALUE'", "--filter 'KEY: VALUE'", 'add YAML hash to filter') do |key_value|
    opt_set_key_value.merge! YAML.load key_value
  end

  opts.on('-t', '--timeout N[smhd]', 'set monitor client timeout interval') do |time|
    opt_timeout = time
  end

  opts.on('-j', '--job json', 'set job') do |job|
    opt_job.merge! YAML.load job
  end

  opts.on('-s', '--stop-query json', 'add query to stop monitor') do |stop_query|
    opt_stop_query.merge! YAML.load stop_query
  end
end

options.parse!(ARGV)

ARGV.each do |arg|
  if arg.index '='
    opt_set_key_value.merge! YAML.load arg.sub(/=/, ': ')
    true
  else
    false
  end
end

if opt_set_key_value.empty?
  puts options
  exit
end

opt_set_key_value['job_id'] = opt_set_key_value['job_id'].to_s if opt_set_key_value['job_id']
opt_timeout = to_seconds(opt_timeout)

monitor = Monitor.new
monitor.monitor_url = opt_monitor_url if opt_monitor_url
monitor.overrides = opt_set_key_value
monitor.action = opt_action
monitor.result_roots = opt_results
monitor.job = opt_job
monitor.stop_query = opt_stop_query

monitor.run(opt_timeout)
