#! /usr/bin/env bash

# @todo This function doesn't work if the file doesn't end in a newline.
watcher::hone() {
  local USAGE="
  $0 < option > { option }

  option:
    --header-content-amalgam
    --header-content-used
    --header-content-raw
    --header-path-used
    --header-path-all
    --help

  example:
    tool/hone --header-content-amalgam > sinclude/watcher/watcher.hpp"
  LAST_DIR="$PWD"
  cd "$(dirname "$0")/../include" || return 1

  HEADER_CONTENT_RAW="$(\
    cd watcher || return 1
    find . -type f -name '*.hpp' -exec cat {} \;
    cd ..
  )"

  HEADER_PATH_ALL="$(\
    cd watcher || return 1
    find . -type f -name '*.hpp' | sed 's/^\.\///'
    cd ..
  )"

  HEADER_PATH_USED="$(\
    while read -r H; \
    do \
      test -f "$H" \
        && echo "$H"; \
    done <<< "$(\
      echo "$HEADER_CONTENT_RAW" \
        | grep -E '^#([ ]*)include' \
        | tr -d '"' \
        | tr -d '<' \
        | tr -d '>' \
        | sed -E 's/.+include (.*)/\1/g' \
        | awk '!seen[$0]++' \
    )" \
  )"

  HEADER_CONTENT_USED="$(\
    while read -r C; do cat "$C"; done <<< "$HEADER_PATH_USED" \
  )"

  PROJECT_ID='W973564ED9F278A21F3E12037288412FBAF175F889'

  HEADER_CONTENT_AMALGAM="$(\
    echo "#ifndef $PROJECT_ID" \
      && echo "#define $PROJECT_ID" \
      && echo "$HEADER_CONTENT_USED" \
        | sed -E '/(#([ ]*)include [<"]watcher.*)|(#pragma once)/d' \
      && echo "#endif /* $PROJECT_ID */" \
  )"

  if test -n "$*"
  then
    if echo "$*" | grep -q -- --header-content-amalgam
    then echo "$HEADER_CONTENT_AMALGAM"; fi
    if echo "$*" | grep -q -- --header-content-used
    then echo "$HEADER_CONTENT_USED"; fi
    if echo "$*" | grep -q -- --header-content-raw
    then echo "$HEADER_CONTENT_RAW"; fi
    if echo "$*" | grep -q -- --header-path-used
    then echo "$HEADER_PATH_USED"; fi
    if echo "$*" | grep -q -- --header-path-all
    then echo "$HEADER_PATH_ALL"; fi
    if echo "$*" | grep -q -- --help
    then echo "$USAGE"; fi
  else
    echo "$USAGE"
  fi

  cd "$LAST_DIR" || return 1
}

watcher::hone $@
exit $?
