_FOSSIL_PROMPT=""

# Prefix at the very beginning of the prompt, before the branch name
ZSH_THEME_FOSSIL_PROMPT_PREFIX="%{$fg_bold[blue]%}fossil:(%{$fg_bold[red]%}"

# At the very end of the prompt
ZSH_THEME_FOSSIL_PROMPT_SUFFIX="%{$fg_bold[blue]%})"

# Text to display if the branch is dirty
ZSH_THEME_FOSSIL_PROMPT_DIRTY=" %{$fg_bold[red]%}✖"

# Text to display if the branch is clean
ZSH_THEME_FOSSIL_PROMPT_CLEAN=" %{$fg_bold[green]%}✔"

function fossil_prompt_info () {
  local _OUTPUT=`fossil branch 2>&1`
  local _STATUS=`echo $_OUTPUT | grep "use --repo"`
  if [ "$_STATUS" = "" ]; then
    local _EDITED=`fossil changes`
    local _EDITED_SYM="$ZSH_THEME_FOSSIL_PROMPT_CLEAN"
    local _BRANCH=`echo $_OUTPUT | grep "* " | sed 's/* //g'`

    if [ "$_EDITED" != "" ]; then
      _EDITED_SYM="$ZSH_THEME_FOSSIL_PROMPT_DIRTY"
    fi

    echo "$ZSH_THEME_FOSSIL_PROMPT_PREFIX" \
      "$_BRANCH" \
      "$ZSH_THEME_FOSSIL_PROMPT_SUFFIX" \
      "$_EDITED_SYM"\
      "%{$reset_color%}"
  fi
}

function _fossil_get_command_list () {
  fossil help -a | grep -v "Usage|Common|This is"
}

function _fossil () {
  local context state state_descr line
  typeset -A opt_args

  _arguments \
    '1: :->command'\
    '2: :->subcommand'

  case $state in
    command)
      local _OUTPUT=`fossil branch 2>&1 | grep "use --repo"`
      if [ "$_OUTPUT" = "" ]; then
        compadd `_fossil_get_command_list`
      else
        compadd clone init import help version
      fi
      ;;
    subcommand)
      if [ "$words[2]" = "help" ]; then
        compadd `_fossil_get_command_list`
      else
        compcall -D
      fi
    ;;
  esac
}

function _fossil_prompt () {
  local current=`echo $PROMPT $RPROMPT | grep fossil`

  if [ "$_FOSSIL_PROMPT" = "" -o "$current" = "" ]; then
    local _prompt=${PROMPT}
    local _rprompt=${RPROMPT}

    local is_prompt=`echo $PROMPT | grep git`

    if [ "$is_prompt" = "" ]; then
      export RPROMPT="$_rprompt"'$(fossil_prompt_info)'
    else
      export PROMPT="$_prompt"'$(fossil_prompt_info) '
    fi

    _FOSSIL_PROMPT="1"
  fi
}

compdef _fossil fossil

autoload -U add-zsh-hook

add-zsh-hook precmd _fossil_prompt