#!/usr/bin/env bash

set -e

command:followers() {
  get-args '?user:get-user'
  report-list \
    "/users/$user/followers?per_page=PER_PAGE" \
    login
}

command:following() {
  get-args '?user:get-user'
  report-list \
    "/users/$user/following?per_page=PER_PAGE" \
    login
}

command:follows() {
  get-args user '?target:get-login'
  api-get "/users/$user/following/$target"
  if OK; then
    msg_ok="'$user' follows '$target'"
  else
    msg_ok="'$user' does not follow '$target'"
  fi
  OK=0
  true
}

command:follow() {
  require-auth
  get-args user:get-owner
  api-put "/user/following/$user"
  msg_ok="'$login' is now following '$user'"
}

command:unfollow() {
  require-auth
  get-args user:get-owner
  api-delete "/user/following/$user"
  msg_ok="'$login' is no longer following '$user'"
}

command:clone() {
  get-args '?owner:get-user/repo:get-repo' '?dir'
  msg_ok=0

  owner_repo="$owner/$repo"

  url="git@github.com:$owner_repo"
  cmd="git clone --recursive $url $dir"
  if [ -n "$branch_name" ]; then
    cmd+=" --branch $branch_name"
  fi

  # TODO Make this dry_run on non-API command be reusable
  "$verbose_output" && nay "$cmd"
  "$dry_run" && {
    nay '*** NOTE: This is a dry run only. ***'
    return 0
  }

  local OK=0
  (
    if "$quiet_output"; then
      $cmd &> /dev/null
    elif "$verbose_output"; then
      (
        set -x
        $cmd
      )
    else
      $cmd
    fi
  ) || OK=1
  if OK; then
    if [ -n "$dir" ]; then
      say "$owner_repo cloned into $dir"
    else
      say "$owner_repo cloned"
    fi
  else
    say "Failed: 'git hub clone $@'"
    if ! "$verbose_output"; then
      say "  Try using -v for more info"
    fi
  fi
}

command:stars() {
  get-args '?owner:get-user/repo:get-repo'
  local title="Stargazers for '$owner/$repo':"
  report-list \
    "/repos/$owner/$repo/stargazers?per_page=PER_PAGE" \
    login
  msg_fail="Couldn't find Stargazers for '$owner/$repo'"
}

command:star() {
  require-auth
  get-args '?owner:get-user/repo:get-repo'
  api-put "/user/starred/$owner/$repo"
  msg_ok="'$owner/$repo' starred"
}

command:unstar() {
  require-auth
  get-args '?owner:get-user/repo:get-repo'
  api-delete "/user/starred/$owner/$repo"
  msg_ok="'$owner/$repo' unstarred"
}

command:watch() {
  require-auth
  get-args '?owner:get-user/repo:get-repo'
  api-put "/user/subscriptions/$owner/$repo"
  msg_ok="You are watching '$owner/$repo'"
}

command:unwatch() {
  require-auth
  get-args '?owner:get-user/repo:get-repo'
  api-delete "/user/subscriptions/$owner/$repo"
  msg_ok="You are no longer watching '$owner/$repo'"
}

command:watching() {
  get-args '?user:get-user'
  say "'$user' is watching:"
  report-list \
    "/users/$user/subscriptions?sort=updated;per_page=PER_PAGE" \
    full_name
}

command:watchers() {
  get-args '?owner:get-user/repo:get-repo'
  say "'$owner/$repo' is being watched by:"
  report-list \
    "/repos/$owner/$repo/subscribers" \
    login
}

command:starred() {
  get-args '?user:get-user'
  report-list \
    "/users/$user/starred?sort=updated;per_page=PER_PAGE" \
    full_name
}

command:collabs() {
  get-args '?owner:get-user/repo:get-repo'
  report-list \
    "/repos/$owner/$repo/collaborators" \
    login
}

command:trust() {
  require-auth
  get-args '?owner:get-user/repo:get-repo' collaborator
  api-put "/repos/$owner/$repo/collaborators/$collaborator"
  msg_ok="'$owner/$repo' commit permission added for: $collaborator"
}

command:untrust() {
  require-auth
  get-args '?owner:get-user/repo:get-repo' collaborator
  api-delete "/repos/$owner/$repo/collaborators/$collaborator"
  msg_ok="'$owner/$repo' commit permission removed for: $collaborator"
}

# vim: set lisp:
