#
# 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.
#
# default gosh_profile
# only read if etc/gosh_profile doesn't exist relative to the System property
# gosh.home or failing that the current directory.

# catch all exceptions from this script to avoid it aborting startup
try {

  # ensure gogo commands are found first
  SCOPE = 'gogo:*'

  # add methods on BundleContext object as commands
  addcommand context ${.context}

  # add methods on System object as commands
  addcommand system (((${.context} getClass) getClassLoader) loadClass java.lang.System)

  # alias to print full stack trace
  e = { $exception printStackTrace }

  ## disable console auto-formatting of each result
  #  you will then need to explicitly use the 'format' command
  #  to print the result of commands that don't write to stdout.
  #.Gogo.format = false

  ## disable printing the formatted result of a command into pipelines
  #.Format.Pipe = false

  # set prompt
  prompt = 'g! '
  \#rprompt = { (new java.text.SimpleDateFormat \'$'\u001B\\[90m'\'HH:mm:ss) format (new Date) }
  secondary-prompt-pattern = '%M%P > '
  # could also be written
  #  \#rprompt = { ${(qq)$(date +$'\u001B\[90m%T')} }


  __option_not_present = {
      res = true
      opts = $argv
      each $opts {
          arg = $it
          each ($.commandLine words) {
              if { ($it toString) equals ($arg toString) } {
                  res = false
              }
          }
      }
      $res
  }

  __load_class = {
      (($.reader class) classLoader) loadClass $1
  }

  __set_unset_arguments = {
      is_setopt = (($.commandLine words) get 0) equals "setopt"
      enums = ((__load_class 'org.jline.reader.LineReader$Option') enumConstants)
      candidates = new ArrayList
      each $enums {
          name = ${(GL)it/_/-}
          is_set = ($.reader isSet $it)
          neg = %(( if(is_setopt, is_set, not(is_set)) ))
          if { $neg } {
              name = "no-${name}"
          }
          if { not  { (($.commandLine words) subList 1 ($.commandLine wordIndex)) contains $name } } {
              $candidates add (new org.jline.reader.Candidate $name $name (if { $neg } { "unset" } { "set" }) null null null true)
          }
      }
      $candidates
  }

  setopt group

  complete -c gogo:complete -e
  complete -c gogo:complete -d "Edit command specific completions"
  complete -c gogo:complete -s c -l command --description "Command to add completion to" -n '__option_not_present -c --command' -a '$.commands'
  complete -c gogo:complete -s s -l short-option --description "Posix-style option to complete" -n '__option_not_present -s --short-option'
  complete -c gogo:complete -s l -l long-option --description "GNU-style option to complete" -n '__option_not_present -l --long-option'
  complete -c gogo:complete -s a -l arguments --description "A list of possible arguments" -n '__option_not_present -a --argument'
  complete -c gogo:complete -s d -l description --description "Description of this completions" -n '__option_not_present -d --description'
  complete -c gogo:complete -s h -l help --description "Display help and exit" -n '__option_not_present -h --help'
  complete -c gogo:complete -s n -l condition --description "The completion should only be used if the specified command has a zero exit status"  -n '__option_not_present -n --condition'
  complete -c gogo:complete -s e -l erase --description "Remove completion"  -n '__option_not_present -e --erase'

  complete -c gogo:history -e
  complete -c gogo:history -d "Show and manipulate command history"
  complete -c gogo:history -l clear --description "Clear history" -n '__option_not_present --clear'
  complete -c gogo:history -l save --description "Save history" -n '__option_not_present --save'

  complete -c gogo:setopt -e
  complete -c gogo:setopt -d "Set or view set shell options"
  complete -c gogo:setopt -a '__set_unset_arguments'

  complete -c gogo:unsetopt -e
  complete -c gogo:unsetopt -d "Unset or view unset shell options"
  complete -c gogo:unsetopt -a '__set_unset_arguments'

  complete -c gogo:cat -e
  complete -c gogo:cat -d "Concatenate and print files"
  complete -c gogo:cat -s n "Number the output lines, starting at 1"
  complete -c gogo:cat -a '__files'

  complete -c gogo:pwd -e
  complete -c gogo:pwd -d "Get current directory"

  complete -c gogo:ls -e
  complete -c gogo:ls -d "List files"

  complete -c gogo:cd -e
  complete -c gogo:cd -d "Change current directory"
  complete -c gogo:cd -a 'wi = ($.commandLine wordIndex); if { %(wi==1) } { __directories } { [ ] }'

  complete -c gogo:sleep -e
  complete -c gogo:sleep -d "Pause execution for the specified amount of time"

  complete -c gogo:echo -e
  complete -c gogo:echo -d "Write arguments to the standard output"
  complete -c gogo:echo -s n -d "No trailing new line"

  complete -c gogo:grep -e
  complete -c gogo:grep -d "File pattern searcher"
  # TODO

  complete -c gogo:sort -e
  complete -c gogo:sort -d "Sort lines of text files"
  # TODO

  complete -c gogo:gosh -e
  complete -c gogo:gosh -d "Execute script with arguments in a new session"
  # TODO

  complete -c gogo:sh -e
  complete -c gogo:sh -d "Execute script with arguments in a new session"
  # TODO

  complete -c gogo:source -e
  complete -c gogo:source -d "Execute script with arguments"
  # TODO

  # TODO: format getopt new set tac type addcommand removeCommand eval

  complete -c gogo:each -e
  complete -c gogo:each -d "Loop and execute script on the specified elements"

  complete -c gogo:if -e
  complete -c gogo:if -d "Conditionaly execute a script"

  complete -c gogo:not -e
  complete -c gogo:not -d "Negates the result of a script"

  complete -c gogo:throw -e
  complete -c gogo:throw -d "Throws an exception"

  complete -c gogo:try -e
  complete -c gogo:try -d "Try executing a script and catch any exception"

  complete -c gogo:until -e
  complete -c gogo:until -d "Loop and execute script until a condition is satisfied"

  complete -c gogo:while -e
  complete -c gogo:while -d "Loop and execute script while a condition is satisfied"

  complete -c gogo:less -e
  complete -c gogo:less -d "File pager"
  complete -c gogo:less -s e -l quit-at-eof --description "Exit on second EOF"
  complete -c gogo:less -s E -l QUIT-AT-EOF --description "Exit on EOF"
  complete -c gogo:less -s q -l quiet -l silent --description "Silent mode"
  complete -c gogo:less -s Q -l QUIET -l SILENT --description "Completely  silent"
  complete -c gogo:less -s S -l chop-long-lines --description "Do not fold long lines"
  complete -c gogo:less -s i -l ignore-case --description "Search ignores lowercase case"
  complete -c gogo:less -s I -l IGNORE-CASE --description "Search ignores all case"
  complete -c gogo:less -s x -l tabs --description "Set tab stops"
  complete -c gogo:less -s N -l LINE-NUMBERS --description "Display line number for each line"
  complete -c gogo:less -a '__files'

  complete -c gogo:nano -e
  complete -c gogo:nano -d "File editor"
  complete -c gogo:nano -a '__files'

  complete -c gogo:keymap -e
  complete -c gogo:keymap -d "Manipulate keymaps"
  complete -c gogo:keymap -s N --description "Create a new keymap" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s d --description "Delete existing keymaps and reset to default state" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s D --description "Delete named keymaps" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s l --description "List existing keymap names" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s r --description "Unbind specified in-strings" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s s --description "Bind each in-string to each out-string" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s A --description "Create alias to keymap" -n '__option_not_present -N -d -D -l -r -s -A'
  complete -c gogo:keymap -s e --description "Select emacs keymap and bind it to main" -n '__option_not_present -e -a -v -M'
  complete -c gogo:keymap -s v --description "Select viins keymap and bind it to main" -n '__option_not_present -e -a -v -M'
  complete -c gogo:keymap -s a --description "Select vicmd keymap" -n '__option_not_present -e -a -v -M'
  complete -c gogo:keymap -s M --description "Specify keymap to select" -n '__option_not_present -e -a -v -M' -a '(keymap -l | tac) split " "'
  complete -c gogo:keymap -s R --description "Interpret in-strings as ranges"
  complete -c gogo:keymap -s p --description "List bindings which have given key sequence as a a prefix"
  complete -c gogo:keymap -s L --description "Output in form of keymap commands"

  complete -c gogo:widget -e
  complete -c gogo:widget -d "Manipulate widgets"
  complete -c gogo:widget -s N --description "Create a new widget" -n '__option_not_present -N -A -D -U -l'
  complete -c gogo:widget -s A --description "Create alias to widget" -n '__option_not_present -N -A -D -U -l'
  complete -c gogo:widget -s D --description "Delete widgets" -n '__option_not_present -N -A -D -U -l'
  complete -c gogo:widget -s U --description "Push characters to the stack" -n '__option_not_present -N -A -D -U -l'
  complete -c gogo:widget -s l --description "List user-defined widgets" -n '__option_not_present -N -A -D -U -l'
  complete -c gogo:widget -s a --description "With -l, list all widgets" -n '__option_not_present -l'

  complete -c gogo:telnetd -e
  complete -c gogo:telnetd -d "Telnet daemon"
  complete -c gogo:telnetd -s i -l ip --description "Listening IP interface" -n '__option_not_present -i --ip'
  complete -c gogo:telnetd -s p -l port --description "Listening IP port" -n '__option_not_present -p --port'
  complete -c gogo:telnetd -a '[start stop status]'

  complete -c gogo:sshd -e
  complete -c gogo:sshd -d "SSH daemon"
  complete -c gogo:sshd -s i -l ip --description "Listening IP interface" -n '__option_not_present -i --ip'
  complete -c gogo:sshd -s p -l port --description "Listening IP port" -n '__option_not_present -p --port'
  complete -c gogo:sshd -a '[start stop status]'

  complete -c gogo:tmux -e
  complete -c gogo:tmux -d "Terminal multiplexer"

  complete -c gogo:bg -e
  complete -c gogo:bg -d "Put job in background"

  complete -c gogo:fg -e
  complete -c gogo:fg -d "Put job in foreground"

  complete -c gogo:jobs -e
  complete -c gogo:jobs -d "List jobs"

  complete -c gogo:clear -e
  complete -c gogo:clear -d "Clear screen"

  complete -c gogo:head -e
  complete -c gogo:head -d "Displays first lines of file"
  complete -c gogo:head -s n -l lines --description "Print line counts"
  complete -c gogo:head -s c -l bytes --description "Print byte counts"
  complete -c gogo:head -a '__files'

  complete -c gogo:tail -e
  complete -c gogo:tail -d "Displays last lines of file"
  complete -c gogo:tail -s q -l quiet --description "Suppress headers when printing multiple sources"
  complete -c gogo:tail -s f -l follow --description "Do not stop at end of file"
  complete -c gogo:tail -s F -l FOLLOW --description "Follow and check for file renaming or rotation"
  complete -c gogo:tail -s n -l lines --description "Number of lines to print"
  complete -c gogo:tail -s c -l bytes --description "Number of bytes to print"
  complete -c gogo:tail -a '__files'

  complete -c gogo:date -e
  complete -c gogo:date -d "Display date and time"
  complete -c gogo:date -s u --description "Use UTC"
  complete -c gogo:date -s r --description "Print the date represented by 'seconds' since January 1, 1970"
  complete -c gogo:date -s v --description "Adjust date"
  complete -c gogo:date -s f --description "Use 'input_fmt' to parse 'new_date'"

  complete -c gogo:wc -e
  complete -c gogo:wc -d "Word, line, character, and byte count"
  complete -c gogo:wc -s n -l lines --description "Print line count"
  complete -c gogo:wc -s c -l bytes --description "Print byte count"
  complete -c gogo:wc -s m -l chars --description "Print character count"
  complete -c gogo:wc -s w -l words --description "Print word count"
  complete -c gogo:wc -a '__files'

  __get_scr_components = {
    list = [ ]
    scrref = ($.context getServiceReference org.osgi.service.component.runtime.ServiceComponentRuntime)
    scr = ($.context getService $scrref)
    each ($scr getComponentDescriptionDTOs ($.context bundles)) {
      $list add ((($it getClass) getField "name") get $it)
    }
    $.context ungetService $scrref
    $list
  }
  __get_bundles_with_scr_components = {
    list = [ ]
    scrref = ($.context getServiceReference org.osgi.service.component.runtime.ServiceComponentRuntime)
    scr = ($.context getService $scrref)
    each ($.context bundles) {
      if { ($scr getComponentDescriptionDTOs $it) isEmpty } { } {
        $list add ($it symbolicName)
      }
    }
    $.context ungetService $scrref
    $list
  }

  complete -c scr:config -e
  complete -c scr:config -d "Show the current SCR configuration"

  complete -c scr:disable -e
  complete -c scr:disable -d "Disable an enabled component"
  complete -c scr:disable -a '__get_scr_components'

  complete -c scr:enable -e
  complete -c scr:enable -d "Enable an disabled component"
  complete -c scr:enable -a '__get_scr_components'

  complete -c scr:info -e
  complete -c scr:info -d "Dump information of a component or component configuration"
  complete -c scr:info -a '__get_scr_components'

  complete -c scr:list -e
  complete -c scr:list -d "List component configurations of a specific bundle"
  complete -c scr:list -a '__get_bundles_with_scr_components'

  # print welcome message
  __resolve_uri = {
    uri = $1
    path = $2
    if { "$uri" startsWith "jar:" } /* then */ {
      idx = ("$uri" indexOf "!")
      p1 = ("$uri" substring 0 $idx)
      p2 = "!"
      p3 = (new java.net.URI ("$uri" substring %(idx+1))) resolve $path
      "$p1$p2$p3"
    } /* else */ {
      $uri resolve $path
    }
  }

  # print welcome message, unless we're explicitly told not to...
  if { $.gosh_quiet } { } { cat (new java.net.URL ($0 toURL) motd) }
} {
    echo "$0: ERROR: $exception"
}

# end
