#!/bin/sh

# 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"

VERIFY_OK_RES=2

CROATOAN_GIT_URL=https://github.com/McParen/croatoan.git

CROATOAN_DIR="$QUICKLISP_INSTALL_DIR"/local-projects/croatoan/

CROATOAN_COMMIT=35c92fcc6c4458339c7e27bdf16f7fa908d95eb8

echo_bold () {
    printf "\033[1m%s\033[0m\n" "$1"
}

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

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>&1 | @AWK@  -- "${chk1_prog}")
    res2=$(@GPG@ --verify quicklisp.lisp.asc quicklisp.lisp 2>&1 | @AWK@  -- "${chk2_prog}")
    res=$((res1 + res2))
    printf "%s" "$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."
        if test "$1" = "" ; then
            @LISP_COMPILER@ --load $QUICKLISP           \
             --eval "(quicklisp-quickstart:install)"    \
             --eval "(ql:add-to-init-file)"             \
             --eval "(sb-ext:quit)";
        else
            @LISP_COMPILER@ --load $QUICKLISP                           \
             --eval "(quicklisp-quickstart:install)"                    \
             --eval "(ql-util:without-prompting (ql:add-to-init-file))" \
             --eval "(sb-ext:quit)";
        fi
        @MKDIR_P@ "$LISP_SOURCE_REGISTRY_DIR"
        PAR_PWD=$(@DIRNAME@ "$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 () {
    sbcl_args=''
    while read -r dep; do
        sbcl_args="$sbcl_args --eval '(ql:quickload \"$dep\")'"
    done < lisp-dependencies
    sbcl_args="$sbcl_args --eval '(sb-ext:quit)'"

    eval "@LISP_COMPILER@ $sbcl_args"
}

install_croatoan () {
    installedp=$(check_croatoan);
    if [ $installedp -eq 0 ]; then
        cd "$CROATOAN_DIR" && @GIT@ pull
    else
        cd "$QUICKLISP_INSTALL_DIR"/local-projects/ && @GIT@ clone "$CROATOAN_GIT_URL"
    fi

    cd "$CROATOAN_DIR" && @GIT@ checkout "$CROATOAN_COMMIT"
}


quicklisp_installed_p=$(check_quicklisp)

if [ $quicklisp_installed_p -eq 0 ]; then
    echo_bold "Quicklisp already installed; fetching libraries..."
    install_dependency
else
    if test "$1" = "--do-not-prompt" ; then
        install_quicklisp 1
    else
        install_quicklisp
    fi
    install_dependency
fi

echo_bold "installing croatoan from git repository..."

install_croatoan

echo_bold "Finished."