#!/usr/bin/env ruby

require 'grpc'
require 'socket'
require 'logger'
require_relative './yggdrasil_services_pb'

class ForemanWorker < Yggdrasil::Worker::Service
  attr_reader :logger

  def initialize(logger = nil)
    @logger = logger || Logger.new(STDOUT)
  end

  # despite the name, this is actually receiving data from server
  def send(data, _call)
    logger.info "I've got data: #{data.inspect}"

    Yggdrasil::Receipt.new
  end
end

def normalize_socket(socket)
  socket.sub('unix:@', 'unix-abstract:')
end

logger = Logger.new('/var/log/ygg/foreman.log')

logger.debug ENV['YGG_SOCKET_ADDR']

socket = normalize_socket(ENV['YGG_SOCKET_ADDR'])
stub = Yggdrasil::Dispatcher::Stub.new(socket, :this_channel_is_insecure)
response = stub.register(Yggdrasil::RegistrationRequest.new(handler: 'foreman', pid: Process.pid))


if response.registered
  socket_address = normalize_socket("unix:#{response.address}")

  logger.info "Foreman worker will listen on #{socket_address}"

  server = GRPC::RpcServer.new
  server.add_http2_port(socket_address, :this_port_is_insecure)
  server.handle(ForemanWorker.new(logger))
  server.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT'])
end
