# frozen_string_literal: true

# This strategy allows normal operation of CodeOcean even when the runner management is disabled.
# However, as no command can be executed, all execution requests will fail.
class Runner::Strategy::Null < Runner::Strategy
  def self.initialize_environment; end

  def self.environments
    raise Runner::Error.new
  end

  def self.sync_environment(_environment)
    raise Runner::Error.new
  end

  def self.remove_environment(_environment)
    raise Runner::Error.new
  end

  def self.request_from_management(_environment)
    SecureRandom.uuid
  end

  def destroy_at_management; end

  def copy_files(_files); end

  def retrieve_files(path: './', recursive: true, privileged_execution: false); end

  def download_file(_file, privileged_execution: false, &_block) # rubocop:disable Lint/UnusedMethodArgument -- for the keyword argument
    raise Runner::Error.new
  end

  def attach_to_execution(command, event_loop, starting_time, privileged_execution: false) # rubocop:disable Lint/UnusedMethodArgument -- for the keyword argument
    socket = Connection.new(nil, self, event_loop)
    # We don't want to return an error if the execution environment is changed
    socket.status = :terminated_by_codeocean if command == ExecutionEnvironment::VALIDATION_COMMAND
    yield(socket, starting_time)
    socket
  end

  def self.available_images
    []
  end

  def self.config; end

  def self.health # rubocop:disable Naming/PredicateMethod
    true
  end

  def self.release
    'N/A'
  end

  def self.pool_size
    {}
  end

  def self.websocket_header
    {}
  end

  class Connection < Runner::Connection
    def decode(event_data)
      event_data
    end

    def encode(data)
      data
    end

    def active?
      false
    end
  end
end
