
require 'rcs-common/trace'
require 'rcs-common/component'

require_release 'rcs-db/db_layer'
require_release 'rcs-db/license'

require_relative 'component_checker'

module RCS
  module Monitor
    class Application
      include RCS::Component

      component(:monitor, name: "RCS Monitor")

      def initialize
        exit!(1) unless RCS::DB::Config.instance.load_from_file
      end

      def first_shard?
         RCS::DB::Config.instance.global['SHARD'] == 'shard0000'
      end

      def setup
        establish_database_connection(wait_until_connected: true)
        LicenseManager.instance.load_from_db

        raise "Must be run on the first shard" unless first_shard?
      end

      def run(options)
        setup

        run_with_rescue do
          EM.epoll
          EM.threadpool_size = 5

          component_checker = ComponentChecker.new

          EM::run do
            component_checker.check_all

            EM.add_periodic_timer(100) { component_checker.check_all }
          end
        end
      end
    end
  end
end
