#!/usr/bin/env bash
#
# Copyright © 2014 Jesse 'Jeaye' Wilkerson
# See licensing in LICENSE file, or at:
#   http://www.opensource.org/licenses/MIT
#
# File: configure
# Author: Jesse 'Jeaye' Wilkerson

# Re-invoke the configure script
# and keep the output at bay.
if [ "$1" != "quiet" ];
then
  "$0" "quiet" "$@" > /dev/null
  exit $?
fi
shift

set -o errexit
set -o nounset

# Determine system
UNAME_LINUX=0
UNAME_CYGWIN=0
UNAME_OSX=0
UNAME_FREEBSD=0
UNAME="$(uname)"
if [ "$UNAME" = "Linux" ];
then
  UNAME_LINUX=1
elif [ "$UNAME" = "Darwin" ];
then
  UNAME_OSX=1
elif [ "$(uname -o)" = "Cygwin" ];
then
  UNAME_CYGWIN=1
elif [ "$UNAME" = "FreeBSD" ];
then
  UNAME_FREEBSD=1
else
  echo "Invalid uname ($UNAME): Unsuppported platform" 1>&2
  exit 1
fi

log() { echo "$@" 1>&2; }

PROJECT=stdman
log "Configuring ${PROJECT}"

PROJECTDIR="${BASH_SOURCE[0]%/*}"
REAL_PROJECTDIR="$(cd "$PROJECTDIR" && pwd)"
PREFIX=/usr/local
DATAROOTDIR="$PREFIX/share"
MANDIR="$DATAROOTDIR/man"
REFERENCE=$REAL_PROJECTDIR/reference/en/cpp
TMP_MAN=$REAL_PROJECTDIR/man
THREADS=8
CXX_PLATFORM_FLAGS=
LD_PLATFORM_LIBS=
if [ "1" -eq "$UNAME_LINUX" ];
then
  log "Platform: Linux"
elif [ "1" -eq "$UNAME_OSX" ];
then
  log "Platform: OS X"
  CXX_PLATFORM_FLAGS="-stdlib=libc++ -I /opt/local/include"
  LD_PLATFORM_LIBS="-lc++"
elif [ "1" -eq "$UNAME_CYGWIN" ];
then
  log "Platform: Cygwin (NOT TESTED)"
elif [ "1" -eq "$UNAME_FREEBSD" ];
then
  log "Platform: FreeBSD"
  CXX_PLATFORM_FLAGS="-I/usr/local/include"
  LD_PLATFORM_LIBS="-L/usr/local/lib"
fi

# Parse params
for i in "$@"
do
  case "$i" in
    --prefix)
      shift
      PREFIX="$1"
      DATAROOTDIR="$PREFIX/share"
      MANDIR="$DATAROOTDIR/man"
      shift
      ;;
    --prefix=*)
      PREFIX="${i#*=}"
      DATAROOTDIR="$PREFIX/share"
      MANDIR="$DATAROOTDIR/man"
      shift
      ;;

    --datarootdir)
      shift
      DATAROOTDIR="$1"
      MANDIR="$DATAROOTDIR/man"
      shift
      ;;
    --datarootdir=*)
      DATAROOTDIR="${i#*=}"
      MANDIR="$DATAROOTDIR/man"
      shift
      ;;

    --mandir)
      shift
      MANDIR="$1"
      shift
      ;;
    --mandir=*)
      MANDIR="${i#*=}"
      shift
      ;;

    --reference)
      shift
      REFERENCE="$1"
      shift
      ;;
    --reference=*)
      REFERENCE="${i#*=}"
      shift
      ;;

    --tmp-man)
      shift
      TMP_MAN="$1"
      shift
      ;;
    --tmp-man=*)
      TMP_MAN="${i#*=}"
      shift
      ;;

    --threads)
      shift
      THREADS="$1"
      shift
      ;;
    --threads=*)
      THREADS="${i#*=}"
      shift
      ;;

    --help*)
      log "Usage: ./configure [OPTION...]"
      log
      log "  --help                              Show this help message"
      log "  --prefix=[/usr/local]               Set installation prefix"
      log "  --datarootdir=[<prefix>/share]      Set data root prefix"
      log "  --mandir=[<prefix>/share/man]       Set man prefix"
      log "  --reference=[./reference/en/cpp]    Set input prefix"
      log "  --tmp-man=[./man]                   Set temporary output prefix"
      log "  --threads=[8]                       Set number of threads to use"
      log
      exit 0
      ;;
    *)
      # Unknown option
      ;;
  esac
done

# Update after params
log
log "Reference location: $REFERENCE"
log "Install prefix: $PREFIX"
log "Install data prefix: $DATAROOTDIR"
log "Install man prefix: $MANDIR"
log "Temporary man location: $TMP_MAN"
log "Generation will be on $THREADS threads"
log

# Configure the makefile
log "Populating Makefile"
rm -f $PROJECTDIR/Makefile
sed "s#%CXX_PLATFORM_FLAGS%#${CXX_PLATFORM_FLAGS}#" "$PROJECTDIR/Makefile.in" |\
sed "s#%LD_PLATFORM_LIBS%#${LD_PLATFORM_LIBS}#" |\
sed "s#%PREFIX%#${PREFIX}#" |\
sed "s#%DATAROOTDIR%#${DATAROOTDIR}#" |\
sed "s#%MANDIR%#${MANDIR}#" |\
sed "s#%REFERENCE%#${REFERENCE}#" |\
sed "s#%TMP_MAN%#${TMP_MAN}#" |\
sed "s#%THREADS%#${THREADS}#" > "$PROJECTDIR/Makefile"

MAKE_C=
if [[ "$PROJECTDIR" != . ]];
then
  MAKE_C=" -C ${PROJECTDIR/#$HOME/~}"
fi

log "Done configuring ${PROJECT}"
log
log "To install, use \`make$MAKE_C install\` with the appropriate permissions for your prefix"
