#
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Shell commands module
module Shell
  @@commands = {}
  def self.commands
    @@commands
  end

  @@command_groups = {}
  def self.command_groups
    @@command_groups
  end

  def self.load_command(name, group, aliases=[])
    return if commands[name]

    # Register command in the group
    raise ArgumentError, "Unknown group: #{group}" unless command_groups[group]
    command_groups[group][:commands] << name

    # Load command
    begin
      require "shell/commands/#{name}"
      klass_name = name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase } # camelize
      commands[name] = eval("Commands::#{klass_name}")
      aliases.each do |an_alias|
        commands[an_alias] = commands[name]
      end
    rescue => e
      raise "Can't load hbase shell command: #{name}. Error: #{e}\n#{e.backtrace.join("\n")}"
    end
  end

  def self.load_command_group(group, opts)
    raise ArgumentError, "No :commands for group #{group}" unless opts[:commands]

    command_groups[group] = {
      :commands => [],
      :command_names => opts[:commands],
      :full_name => opts[:full_name] || group,
      :comment => opts[:comment]
    }

    all_aliases = opts[:aliases] || {}

    opts[:commands].each do |command|
      aliases = all_aliases[command] || []
      load_command(command, group, aliases)
    end
  end

  #----------------------------------------------------------------------
  class Shell
    attr_accessor :hbase
    attr_accessor :formatter

    @debug = false
    attr_accessor :debug

    def initialize(hbase, formatter)
      self.hbase = hbase
      self.formatter = formatter
    end

    def hbase_admin
      @hbase_admin ||= hbase.admin(formatter)
    end

    def hbase_table(name)
      hbase.table(name, self)
    end

    def hbase_replication_admin
      @hbase_replication_admin ||= hbase.replication_admin(formatter)
    end

    def hbase_security_admin
      @hbase_security_admin ||= hbase.security_admin(formatter)
    end

    def hbase_visibility_labels_admin
      @hbase_visibility_labels_admin ||= hbase.visibility_labels_admin(formatter)
    end
    
    def hbase_quotas_admin
      @hbase_quotas_admin ||= hbase.quotas_admin(formatter)
    end

    def export_commands(where)
      ::Shell.commands.keys.each do |cmd|
        # here where is the IRB namespace
        # this method just adds the call to the specified command
        # which just references back to 'this' shell object
        # a decently extensible way to add commands
        where.send :instance_eval, <<-EOF
          def #{cmd}(*args)
            ret = @shell.command('#{cmd}', *args)
            puts
            return ret
          end
        EOF
      end
    end

    def command_instance(command)
      ::Shell.commands[command.to_s].new(self)
    end

    #call the method 'command' on the specified command
    def command(command, *args)
      internal_command(command, :command, *args)
    end

    #call a specific internal method in the command instance
    # command  - name of the command to call
    # method_name - name of the method on the command to call. Defaults to just 'command'
    # args - to be passed to the named method
    def internal_command(command, method_name= :command, *args)
      command_instance(command).command_safe(self.debug,method_name, *args)
    end

    def print_banner
      puts "HBase Shell; enter 'help<RETURN>' for list of supported commands."
      puts 'Type "exit<RETURN>" to leave the HBase Shell'
      print 'Version '
      command('version')
      puts
    end

    def help_multi_command(command)
      puts "Command: #{command}"
      puts command_instance(command).help
      puts
      return nil
    end

    def help_command(command)
      puts command_instance(command).help
      return nil
    end

    def help_group(group_name)
      group = ::Shell.command_groups[group_name.to_s]
      group[:commands].sort.each { |cmd| help_multi_command(cmd) }
      if group[:comment]
        puts '-' * 80
        puts
        puts group[:comment]
        puts
      end
      return nil
    end

    def help(command = nil)
      if command
        return help_command(command) if ::Shell.commands[command.to_s]
        return help_group(command) if ::Shell.command_groups[command.to_s]
        puts "ERROR: Invalid command or command group name: #{command}"
        puts
      end

      puts help_header
      puts
      puts 'COMMAND GROUPS:'
      ::Shell.command_groups.each do |name, group|
        puts "  Group name: " + name
        puts "  Commands: " + group[:command_names].sort.join(', ')
        puts
      end
      unless command
        puts 'SHELL USAGE:'
        help_footer
      end
      return nil
    end

    def help_header
      return "HBase Shell, version #{org.apache.hadoop.hbase.util.VersionInfo.getVersion()}, " +
             "r#{org.apache.hadoop.hbase.util.VersionInfo.getRevision()}, " +
             "#{org.apache.hadoop.hbase.util.VersionInfo.getDate()}" + "\n" +
        "Type 'help \"COMMAND\"', (e.g. 'help \"get\"' -- the quotes are necessary) for help on a specific command.\n" +
        "Commands are grouped. Type 'help \"COMMAND_GROUP\"', (e.g. 'help \"general\"') for help on a command group."
    end

    def help_footer
      puts <<-HERE
Quote all names in HBase Shell such as table and column names.  Commas delimit
command parameters.  Type <RETURN> after entering a command to run it.
Dictionaries of configuration used in the creation and alteration of tables are
Ruby Hashes. They look like this:

  {'key1' => 'value1', 'key2' => 'value2', ...}

and are opened and closed with curley-braces.  Key/values are delimited by the
'=>' character combination.  Usually keys are predefined constants such as
NAME, VERSIONS, COMPRESSION, etc.  Constants do not need to be quoted.  Type
'Object.constants' to see a (messy) list of all constants in the environment.

If you are using binary keys or values and need to enter them in the shell, use
double-quote'd hexadecimal representation. For example:

  hbase> get 't1', "key\\x03\\x3f\\xcd"
  hbase> get 't1', "key\\003\\023\\011"
  hbase> put 't1', "test\\xef\\xff", 'f1:', "\\x01\\x33\\x40"

The HBase shell is the (J)Ruby IRB with the above HBase-specific commands added.
For more on the HBase Shell, see http://hbase.apache.org/book.html
      HERE
    end
  end
end

# Load commands base class
require 'shell/commands'

# Load all commands
Shell.load_command_group(
  'general',
  :full_name => 'GENERAL HBASE SHELL COMMANDS',
  :commands => %w[
    status
    version
    table_help
    whoami
  ]
)

Shell.load_command_group(
  'ddl',
  :full_name => 'TABLES MANAGEMENT COMMANDS',
  :commands => %w[
    alter
    create
    describe
    disable
    disable_all
    is_disabled
    drop
    drop_all
    enable
    enable_all
    is_enabled
    exists
    list
    show_filters
    alter_status
    alter_async
    get_table
  ],
  :aliases => {
    'describe' => ['desc']
  }
)

Shell.load_command_group(
  'namespace',
  :full_name => 'NAMESPACE MANAGEMENT COMMANDS',
  :commands => %w[
    create_namespace
    drop_namespace
    alter_namespace
    describe_namespace
    list_namespace
    list_namespace_tables
  ]
)

Shell.load_command_group(
  'dml',
  :full_name => 'DATA MANIPULATION COMMANDS',
  :commands => %w[
    count
    delete
    deleteall
    get
    get_counter
    incr
    put
    scan
    truncate
    truncate_preserve
    append
    get_splits
  ]
)

Shell.load_command_group(
  'tools',
  :full_name => 'HBASE SURGERY TOOLS',
  :comment => "WARNING: Above commands are for 'experts'-only as misuse can damage an install",
  :commands => %w[
    assign
    balancer
    balance_switch
    balancer_enabled
    close_region
    compact
    flush
    major_compact
    move
    split
    merge_region
    unassign
    zk_dump
    wal_roll
    catalogjanitor_run
    catalogjanitor_switch
    catalogjanitor_enabled
    compact_rs
    trace
  ],
  # TODO remove older hlog_roll command
  :aliases => {
    'wal_roll' => ['hlog_roll']
  }
)

Shell.load_command_group(
  'replication',
  :full_name => 'CLUSTER REPLICATION TOOLS',
  :comment => "In order to use these tools, hbase.replication must be true.",
  :commands => %w[
    add_peer
    remove_peer
    list_peers
    enable_peer
    disable_peer
    show_peer_tableCFs
    set_peer_tableCFs
    list_replicated_tables
    append_peer_tableCFs
    remove_peer_tableCFs
    enable_table_replication
    disable_table_replication
  ]
)

Shell.load_command_group(
  'snapshots',
  :full_name => 'CLUSTER SNAPSHOT TOOLS',
  :commands => %w[
    snapshot
    clone_snapshot
    restore_snapshot
    delete_snapshot
    delete_all_snapshot
    list_snapshots
  ]
)

Shell.load_command_group(
  'configuration',
  :full_name => 'ONLINE CONFIGURATION TOOLS',
  :commands => %w[
    update_config
    update_all_config
  ]
)

Shell.load_command_group(
  'quotas',
  :full_name => 'CLUSTER QUOTAS TOOLS',
  :commands => %w[
    set_quota
    list_quotas
  ]
)

Shell.load_command_group(
  'security',
  :full_name => 'SECURITY TOOLS',
  :comment => "NOTE: Above commands are only applicable if running with the AccessController coprocessor",
  :commands => %w[
    grant
    revoke
    user_permission
  ]
)

Shell.load_command_group(
  'procedures',
  :full_name => 'PROCEDURES MANAGEMENT',
  :commands => %w[
    abort_procedure
    list_procedures
  ]
)

Shell.load_command_group(
  'visibility labels',
  :full_name => 'VISIBILITY LABEL TOOLS',
  :comment => "NOTE: Above commands are only applicable if running with the VisibilityController coprocessor",
  :commands => %w[
    add_labels
    list_labels
    set_auths
    get_auths
    clear_auths
    set_visibility
  ]
)
