#!/bin/sh
VERSION=1.2.0
VERSION_FULL=${VERSION}$(./version.sh)
ICON_SIZES="$(for i in 24 32 48 64 128 256; do printf 'icons/hicolor/%sx%s/apps/goodwolf.png ' $i $i ; done)"
DEPS="gtk+-3.0 libxml-2.0"

min_webkitgtk=2.32.0
min_glib_guri=2.66.0

usage() {
cat <<END
Usage: [variables] configure [variables]

Variables:
  PREFIX=DIR
  BINDIR=DIR
  MANDIR=DIR
  DOCDIR=DIR
  DATADIR=DIR
  APPSDIR=DIR

  PKGCONFIG=BIN
  MSGFMT=BIN
  INKSCAPE=BIN
  CC=BIN
  CFLAGS=OPTIONS
  LDFLAGS=OPTIONS
  EXTRA_CFLAGS=OPTIONS
  MANDOC=BIN
  SHELLCHECK=BIN
  FLAWFINDER=BIN

  WITH_WEBKITGTK=(4.0|4.1)
  WITH_URI_PARSER=(guri|libsoup2)

Variables are set in the following order: Default, Environment, Arguments

Dependencies: See README.md
END
}

is_ok() {
	status="$?"

	if test $status -eq 0; then
		printf " OK\n"
	else
		printf " FAIL\n"
	fi

	return $status
}

required() {
	is_ok || exit 1
}

pkg_config_check() {
	printf 'Checking: %s %s ...' "${PKGCONFIG}" "$*"
	"${PKGCONFIG}" "$@"
	is_ok
}

## User configuration

# defaults
PREFIX="${PREFIX:-/usr/local}"
PKGCONFIG="${PKGCONFIG:-pkg-config}"
MSGFMT="${MSGFMT:-msgfmt}"
INKSCAPE="${INKSCAPE:-inkscape}"
CC="${CC:-cc}"
CFLAGS="${CFLAGS:--g -O2 -pie -fPIE}"
MANDOC="${MANDOC:-mandoc}"
SHELLCHECK="${SHELLCHECK:-shellcheck}"
FLAWFINDER="${FLAWFINDER:-flawfinder}"


# Also allow variables through arguments
for i; do
	case "$i" in
	-h|--help)
		usage
		exit 1
	;;
	-*)
		printf "Unknown argument ‘%s’\n" "${i}"
		usage
		exit 1
	;;
	*=*)
		# shellcheck disable=SC2163
		export "$i"
		shift
	;;
	*)
		printf "Unknown argument ‘%s’\n" "${i}"
		usage
		exit 1
	;;
	esac
done

# Fallback definitions for dirs, based on $PREFIX
BINDIR="${BINDIR:-${PREFIX}/bin}"
MANDIR="${MANDIR:-${PREFIX}/share/man}"
DOCDIR="${DOCDIR:-${PREFIX}/share/doc/goodwolf-${VERSION}}"
DATADIR="${DATADIR:-${PREFIX}/share/goodwolf}"
APPSDIR="${APPSDIR:-${PREFIX}/share/applications}"

# Add some extra CFLAGS
CFLAGS="${CFLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wconversion -Wsign-conversion -Werror=implicit-function-declaration -Werror=implicit-int -Werror=vla ${EXTRA_CFLAGS}"

## System checks
# commands
printf 'Checking %s command existance ...' "${PKGCONFIG}"
command -v "${PKGCONFIG}" >/dev/null ; required

printf 'Checking %s command existance ...' "${CC}"
command -v "${CC}" >/dev/null ; required

printf 'Checking %s command existance ...' "${MANDOC}"
if command -v "${MANDOC}" >/dev/null ; is_ok
then
	:
else
	printf 'Warning: manpage linting via mandoc(1) disabled'
	MANDOC="true"
fi

printf 'Checking %s command existance ...' "${SHELLCHECK}"
if command -v "${SHELLCHECK}" >/dev/null ; is_ok
then
	:
else
	printf 'Warning: shell linting via shellcheck(1) disabled'
	SHELLCHECK="true"
fi

printf 'Checking %s command existance ...' "${FLAWFINDER}"
if command -v "${FLAWFINDER}" >/dev/null ; is_ok
then
	:
else
	printf 'Warning: C analysis via flawfinder(1) disabled'
	SHELLCHECK="true"
fi


echo

# pkg-config
for dep in ${DEPS}
do
	pkg_config_check --exists "$dep" || exit 1
done

case "${WITH_WEBKITGTK}n" in
	4.1n)
		pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.1 || exit 1
		DEPS="${DEPS} webkit2gtk-4.1"
	;;
	4.0n)
		pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.0 || exit 1
		DEPS="${DEPS} webkit2gtk-4.0"
	;;
	n)
		echo "notice: Packagers should consider setting the ABI version (4.0 or 4.1) in WITH_WEBKITGTK" >&2
		if pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.1
		then
			DEPS="${DEPS} webkit2gtk-4.1"
		else
			pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.0 || exit 1
			DEPS="${DEPS} webkit2gtk-4.0"
		fi
	;;
	*)
		echo "error: invalid webkit2gtk version in WITH_WEBKITGTK environment variable, must be 4.0 or 4.1" >&2
		exit 1
	;;
esac

case "${WITH_URI_PARSER}n" in
	gurin)
		echo "URI parser selected: GUri from glib-2.0"
		pkg_config_check --atleast-version="${min_glib_guri}" glib-2.0 || exit 1
		DEPS="${DEPS} glib-2.0"
	;;
	libsoup2n)
		echo "URI parser selected: libsoup-2.4"
		pkg_config_check libsoup-2.4 || exit 1
		DEPS="${DEPS} libsoup-2.4"
		CFLAGS="${CFLAGS} -DUSE_LIBSOUP2"

		if echo "${DEPS}" | grep -q 'webkit2gtk-4.1'
		then
			echo 'warning: libsoup2 selected while WebKitGTK with libsoup3 API is used' >&2
		fi
	;;
	n)
		echo "notice: Packagers should consider setting the URI parsing library (guri or libsoup2) in WITH_URI_PARSER" >&2

		if echo "${DEPS}" | grep -q 'webkit2gtk-4.0'
		then
			pkg_config_check libsoup-2.4 || exit 1
			echo "URI parser selected: libsoup-2.4"
			DEPS="${DEPS} libsoup-2.4"
			CFLAGS="${CFLAGS} -DUSE_LIBSOUP2"
		else
			pkg_config_check --atleast-version="${min_glib_guri}" glib-2.0 || exit 1
			echo "URI parser selected: GUri from glib-2.0"
			DEPS="${DEPS} glib-2.0"
		fi
	;;
	*)
		echo "error: invalid uri provider in WITH_URI_PARSER environment variable, must be guri or libsoup2" >&2
	;;
esac

printf 'Using pkg-config to get CFLAGS for %s ...' "${DEPS}"
get_cflags() { "${PKGCONFIG}" --cflags "${DEPS}"; }
DEPS_cflags="$(get_cflags)"
required

printf 'Using pkg-config to get LIBS for %s ...' "${DEPS}"
get_libs() { "${PKGCONFIG}" --libs "${DEPS}"; }
DEPS_libs="$(get_libs)"
required

## Configuration write

printf '\nWriting to config.mk ...'
cat >config.mk <<EOF
# Autogenerated by ./configure
PACKAGE = Badwolf
VERSION = ${VERSION}
VERSION_FULL = ${VERSION_FULL}

PREFIX  = ${PREFIX}
BINDIR  = ${BINDIR}
MANDIR  = ${MANDIR}
DOCDIR  = ${DOCDIR}
DATADIR = ${DATADIR}
APPSDIR = ${APPSDIR}

PKGCONFIG = ${PKGCONFIG}
CC = ${CC}
INKSCAPE = ${INKSCAPE}
MSGFMT = ${MSGFMT}
DBG = ${DBG}
MANDOC = ${MANDOC}
SHELLCHECK = ${SHELLCHECK}
FLAWFINDER = ${FLAWFINDER}

CFLAGS = ${CFLAGS} -DDATADIR=\"\${DATADIR}\" -DPACKAGE=\"\${PACKAGE}\" -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"\${VERSION_FULL}\" ${DEPS_cflags}
LDFLAGS = ${LDFLAGS}
LIBS = ${DEPS_libs}
ICON_SIZES = ${ICON_SIZES}
EOF
is_ok

echo 'Done, you can now run make'
