#! @BASH@

# tinmop: an humble mastodon client
# Copyright (C) 2020  cage

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.
# If not, see [[http://www.gnu.org/licenses/][http://www.gnu.org/licenses/]].

QUICKLISP_INSTALL_DIR=$HOME/quicklisp/

QUICKLISP_URL="https://beta.quicklisp.org/quicklisp.lisp"
QUICKLISP_SIG_URL="https://beta.quicklisp.org/quicklisp.lisp.asc"
QUICKLISP_KEY_URL="https://beta.quicklisp.org/release-key.txt"

QUICKLISP="quicklisp.lisp"
QUICKLISP_SIG="quicklisp.lisp.asc"
QUICKLISP_KEY="release-key"

QUICKLISP_SIGNATURE="D7A3 +489D +DEFE +32B7 +D0E7 +CC61 +3079 +65AB +028B +5FF7";

LISP_SOURCE_REGISTRY_DIR="$HOME/.config/common-lisp/"

LISP_SOURCE_REGISTRY_FILE="$LISP_SOURCE_REGISTRY_DIR/source-registry.conf"

BOLD_TEXT="\033[1m"

NORMAL_TEXT="\033[0m"

VERIFY_OK_RES=2

echo_bold () {
    echo -e "${BOLD_TEXT}${1}${NORMAL_TEXT}";
}

check_quicklisp () {
    if [ -d "$QUICKLISP_INSTALL_DIR" ]; then
        echo 0;
    else
        echo 1;
    fi
}

check_quicklisp_signature () {
    chk1_prog='BEGIN {res=0} /Good signature.*release@quicklisp.org/ {res++; print res}'
    chk2_prog="BEGIN {res=0} /${QUICKLISP_SIGNATURE}/ {res++; print res}"
    res1=$(LC_MESSAGES="C" @GPG@ --verify quicklisp.lisp.asc quicklisp.lisp 2> >(@GAWK@  -- "${chk1_prog}"))
    res2=$(@GPG@ --verify quicklisp.lisp.asc quicklisp.lisp 2> >(@GAWK@  -- "${chk2_prog}"))
    res=$(expr $res1 + $res2)
    echo -n "$res"
}

install_quicklisp () {
    echo_bold "Downloading quicklisp...";
    @CURL@ "$QUICKLISP_URL"     > $QUICKLISP;
    @CURL@ "$QUICKLISP_SIG_URL" > $QUICKLISP_SIG;
    @CURL@ "$QUICKLISP_KEY_URL" > $QUICKLISP_KEY;
    echo_bold "Importing gpg key.";
    @GPG@ --import $QUICKLISP_KEY;
    echo_bold "Verifing key";
    signature_verified=$(check_quicklisp_signature);
    if [ "$signature_verified" -ne $VERIFY_OK_RES ]; then
         echo_bold "Key verification failed!"
         exit 1;
    else
        echo_bold "Key sucessfully verified.";
        @LISP_COMPILER@ --load $QUICKLISP            \
          --eval "(quicklisp-quickstart:install)"    \
          --eval "(ql:add-to-init-file)"             \
          --eval "(sb-ext:quit)";
        @MKDIR_P@ $LISP_SOURCE_REGISTRY_DIR;
        PAR_PWD="${PWD%/*}";
        echo "(:source-registry"       >  $LISP_SOURCE_REGISTRY_FILE;
        echo "  (:tree \"$PAR_PWD\")"  >> $LISP_SOURCE_REGISTRY_FILE;
        echo ":inherit-configuration)" >> $LISP_SOURCE_REGISTRY_FILE;
        echo "quicklisp installed";
    fi
}

install_dependency () {
    # add here the lisp dependency
    # e.g.
    # @LISP_COMPILER@  \                   <- note the '\'
    #  --eval "(ql:quickload \"swank\")" \ <- note the '\'
    #  --eval "(sb-ext:quit)";             <- keep this line as latest
    @LISP_COMPILER@  \
     --eval "(ql:quickload \"alexandria\")"       \
     --eval "(ql:quickload \"cl-ppcre\")"         \
     --eval "(ql:quickload \"tooter\")"           \
     --eval "(ql:quickload \"croatoan\")"         \
     --eval "(ql:quickload \"osicat\")"           \
     --eval "(ql:quickload \"cl-spark\")"         \
     --eval "(ql:quickload \"access\")"           \
     --eval "(ql:quickload \"sqlite\")"           \
     --eval "(ql:quickload \"sxql\")"             \
     --eval "(ql:quickload \"sxql-composer\")"    \
     --eval "(ql:quickload \"marshal\")"          \
     --eval "(ql:quickload \"bordeaux-threads\")" \
     --eval "(ql:quickload \"log4cl\")"           \
     --eval "(ql:quickload \"local-time\")"       \
     --eval "(ql:quickload \"cl-colors2\")"       \
     --eval "(ql:quickload \"cl-i18n\")"          \
     --eval "(ql:quickload \"clunit2\")"          \
     --eval "(ql:quickload \"esrap\")"            \
     --eval "(ql:quickload \"ieee-floats\")"      \
     --eval "(ql:quickload \"parse-number\")"     \
     --eval "(ql:quickload \"cl-html5-parser\")"  \
     --eval "(ql:quickload \"unix-opts\")"        \
     --eval "(ql:quickload \"crypto-shortcuts\")" \
     --eval "(ql:quickload \"drakma\")"           \
     --eval "(ql:quickload \"usocket\")"          \
     --eval "(ql:quickload \"cffi\")"             \
     --eval "(ql:quickload \"babel\")"            \
     --eval "(ql:quickload \"percent-encoding\")" \
     --eval "(sb-ext:quit)";
}

quicklisp_installed_p=$(check_quicklisp);

if [ $quicklisp_installed_p -eq 0 ]; then
    echo_bold "Quicklisp already installed; fetching libraries...";
    install_dependency;
else
    install_quicklisp;
    install_dependency;
fi

echo_bold "Finished."