module Import
  module Zendesk
    module Async
      # rubocop:disable Style/ModuleFunction
      extend self

      def start_bg
        Setting.reload

        Import::Zendesk.connection_test

        # get statistic before starting import
        statistic

        # start thread to observe current state
        status_update_thread = Thread.new {
          loop do
            result = {
              data: current_state,
              result: 'in_progress',
            }
            Cache.write('import:state', result, expires_in: 10.minutes)
            sleep 8
          end
        }
        sleep 2

        # start import data
        begin
          Import::Zendesk.start
        rescue => e
          status_update_thread.exit
          status_update_thread.join
          Rails.logger.error e
          result = {
            message: e.message,
            result: 'error',
          }
          Cache.write('import:state', result, expires_in: 10.hours)
          return false
        end
        sleep 16 # wait until new finished import state is on client
        status_update_thread.exit
        status_update_thread.join

        result = {
          result: 'import_done',
        }
        Cache.write('import:state', result, expires_in: 10.hours)

        Setting.set('system_init_done', true)
        Setting.set('import_mode', false)
      end

      def status_bg
        state = Cache.get('import:state')
        return state if state
        {
          message: 'not running',
        }
      end
    end
  end
end
