#!/bin/sh
set -eu

# shellcheck source=/dev/null
. "$DOTFILES/sh/colors.sh"

missing() {
  red "Missing argument <${1}>.\n" >&2
}

usage() {
  cat <<EOF >&2
Usage:
    $0 <TYPE> <FULL_TITLE>

    Arguments:
      TYPE             The type of the article: article, til, slides, podcast, screencast
      FULL_TITLE       Full title of the post

Examples:
    $0 til 'I just learned this'
    $0 article 'My example article title'
EOF
}

TYPE="${1:-}"
[ -z "$TYPE" ] && {
  missing 'TYPE'
  usage
  exit 2
}

EXTRA=''
case "$TYPE" in
  article|til)
    LAYOUT=post
    DIR="_${TYPE}s"
    EXT=md
    ;;
  podcast|screencast)
    LAYOUT=post
    DIR="_${TYPE}s"
    EXT=md
    EXTRA="
$TYPE: true
"
    ;;
  slides)
    LAYOUT=slides
    DIR=_slides
    EXT=slides
    ;;
  *)
    red "Invalid type '$TYPE'\n" >&2
    usage
    exit 2
    ;;
esac

FULL_TITLE="${2:-}"
[ -z "$FULL_TITLE" ] && {
  missing 'FULL_TITLE'
  usage
  exit 2
}

# Derived from:
# https://stackoverflow.com/questions/4009281/how-can-i-generate-url-slugs-in-perl/4009519#4009519
slugify() {
  echo "$1"                     | \
    tr '[:upper:]' '[:lower:]'  | \
    perl -ne 'tr/\000-\177//cd;
              s/[^\w\s-]//g;
              s/^\s+|\s+$//g;
              s/[-\s]+/-/g;
              print;'
}

WEBSITE_REPO="$HOME/dev/libre/website"
SLUG_TITLE="$(slugify "$FULL_TITLE")"
PASTE_DATE="$(date -I)"
OUT="$WEBSITE_REPO/$DIR/$PASTE_DATE-$SLUG_TITLE.$EXT"

cd "$WEBSITE_REPO"

if [ -f "$OUT" ]; then
  exec vi "$OUT"
fi

if [ "$LAYOUT" = 'slides' ]; then
  ARTICLE="$($0 article "$FULL_TITLE")"
  cat<<EOF > "$OUT"
---

title: $FULL_TITLE

date: $PASTE_DATE

layout: $LAYOUT

lang: en

ref: $SLUG_TITLE

article: $ARTICLE
$EXTRA
---

---

## Thank you!

References:

1. FIXME
2. FIXME
EOF
else
  cat <<EOF > "$OUT"
---

title: $FULL_TITLE

date: $PASTE_DATE

layout: $LAYOUT

lang: en

ref: $SLUG_TITLE

---
EOF
fi

vi "$OUT"
