#!/usr/bin/env bash

set -e

command:repos() {
  get-args owner:get-user
  title="Repos for '$owner':"
  report-list \
    "/users/$owner/repos?sort=pushed;per_page=PER_PAGE" \
    'pushed_at full_name description'
}

format-entry:repos() {
  if "$raw_output"; then
    out "$3"
  else
    printf -v output_line "%d) (%s)  %-30s %s" "$1" "${2/T*}" "$3" "$4"
  fi
}

command:repo() {
  get-args '?owner:get-user/repo:get-repo'
  api-get "/repos/$owner/$repo"
}

ok:repo() {
  fields=(
    full_name description homepage language
    html_url ssh_url
    forks parent__full_name source__full_name
    watchers open_issues pushed_at created_at
    privatex
  )
  report-data
}

command:repo-get() {
  get-args '?owner:get-user/repo:get-repo' key
  api-get "/repos/$owner/$repo"
  OK || {
    msg_fail="Repo '$owner/$repo' not found"
    return
  }
  local value="$(JSON.get -a "/$key" -)"
  if [ -n "$value" ]; then
    msg_ok="$value"
  else
    msg_fail="Couldn't get value for '$key'"
    OK=1
  fi
}

command:repo-edit() {
  require-auth
  get-args '?owner:get-user/repo:get-repo' %pairs
  local adds=(name "$repo")
  for (( i = 0; i < ${#pairs[@]}; i = i + 2 )); do
    if [ "${pairs[$i]}" == name ]; then
      adds=()
      break
    fi
  done
  pairs+=( "${adds[@]}" )
  api-patch "/repos/$owner/$repo" "$(json-dump-object-pairs)"
}

# TODO Support creating repo under an org
command:repo-new() {
  require-auth
  get-args '?org:get-user/repo:get-repo'
  local login=$(get-login)
  if [ "$org" == "$login" ]; then
    api-post "/user/repos" "$(json-dump-object name "$repo")"
  else
    api-post "/orgs/$org/repos" "$(json-dump-object name "$repo")"
  fi
  msg_ok="Repository 'git@github.com:$org/$repo' created."
  msg_422="Repository name 'git@github.com:$org/$repo' already exists."
}

command:repo-delete() {
  require-auth
  get-args 'owner/repo'
  if [ "$owner/$repo" == "ingydotnet/git-hub" ]; then
    die "Won't delete ingydotnet/git-hub. That's suicide!!"
  fi
  api-delete "/repos/$owner/$repo"
  msg_ok="Repository '$owner/$repo' deleted"
  msg_404="Repository '$owner/$repo' not found"
}

# vim: set lisp:
