require "grape"
require "get_process_mem"

module RestFtpDaemon
  module API
    class Root < Grape::API


####### CLASS CONFIG

      helpers RestFtpDaemon::LoggerHelper

      logger RestFtpDaemon::LoggerPool.instance.get :api

      do_not_route_head!
      do_not_route_options!

      format :json

      mount RestFtpDaemon::API::Jobs => "/jobs"
      mount RestFtpDaemon::API::Dashbaord => "/"


####### INITIALIZATION

      def initialize
        # Call daddy
        super

        # Check that Queue and Pool are available
        raise RestFtpDaemon::MissingQueue unless defined? $queue
        raise RestFtpDaemon::MissingPool unless defined? $pool
      end


####### HELPERS

      helpers do
        def logger
          Root.logger
        end
      end


####### Common request logging
    before do
      log_info "HTTP #{request.request_method} #{request.fullpath}", params
    end


####### SHOW ROUTES

      desc "Show application routes"
      get "/routes" do
        status 200
        return RestFtpDaemon::API::Root.routes
      end


####### SHOW STATUS

      desc "Show daemon status"
      get "/status" do
        mem = GetProcessMem.new
        status 200
        return  {
          hostname: `hostname`.to_s.chomp,
          version: APP_VER,
          started: APP_STARTED,
          uptime: (Time.now - APP_STARTED).round(1),
          counters: $queue.counters,
          memory_bytes: mem.bytes.to_i,
          memory_mb: mem.mb.round(0),
          status: $queue.counts_by_status,
          workers: $pool.worker_variables,
          jobs_count: $queue.jobs_count,
          jobs_queued: $queue.queued_ids
          }
      end


####### SHOW CONFIG

      desc "Show daemon config"
      get "/config" do
        status 200
        return Helpers.get_censored_config
      end


####### RELOAD CONFIG

      desc "Reload daemon config"
      post "/config/reload" do
        if Settings.at(:debug, :allow_reload)==true
          Settings.reload!
          status 200
          return Helpers.get_censored_config
        else
          status 403
          return "Config reload not permitted"
        end
      end

    end
  end
end