#!/usr/bin/env bash
# pakka - An AUR/custom helper for Arch Linux
set -eEu
set -o pipefail
IFS=$'\n\t'
SELF=Pakka
SELF_VERSION="0.0.1"
# CWD=$(pwd)

CONFIGDIR=${CONFIGDIR:-$HOME/.config/pakka}
# When the config file doesn't exists, exit.
if [[ ! -f "$CONFIGDIR/config" ]]; then
	echo "$SELF: Cannot load config file. Exiting"
	exit 1
fi
# Source 
source "$CONFIGDIR/config"
CACHEDIR=${CACHEDIR:-$HOME/.cache/pakka}
mkdir -p "$CACHEDIR/packaging"
mkdir -p "$CACHEDIR/packages"

msg_info()
{
	echo "[INFO] $*"
}

msg_error()
{
	echo "[ERROR] $*"
	exit 1
}

msg_warn()
{
	echo "[WARNING] $*"
}

exitm() {
    exit "$1"
}


flags_process() {
    ARG1="$1"
    C=0
    F="" # full form option
    S="" # Short form option
    TEMP=""
    LC=""
    for i in $(echo "$ARG1" | sed -e 's/\(.\)/\1\n/g');
    do
        if [[ $i == "-" ]]; then
            if [[ $C == 2 ]]; then
                C=1
                F+="--$TEMP"
                TEMP=""
            elif [[ $LC == "-" ]]; then
                C=2
            else
                C=1
            fi
        else
            if [[ $C == 1 ]];then
                S+="-$i"
            else
                TEMP+=$i
            fi
        fi
        LC=$i
        # echo $i
    done
    F+="--$TEMP"
    [[ "$F" == *"--sync"* ]] || [[ "$S" == *!(-)"-S"* ]] && SYNC=true
    [[ "$F" == *"--search"* ]] || [[ "$S" == *!(-)"-s"* ]] && SEARCH=true
    [[ "$F" == *"--update"* ]] || [[ "$S" == *!(-)"-u"* ]] && UPDATE=true
    [[ "$F" == *"--version"* ]] || [[ "$S" == *!(-)"-V"* ]] && GIVE_VERSION=true
    echo 
}

update() {
exit
}

refresh() {
exit
}

search() {
    curl -s "https://aur.archlinux.org/rpc/?v=5&type=search&arg=$1" | jq '.results[] | {Name,Description}' || msg_error "Cannot query database"
}

install() {
    i="$1" # package name
    msg_info "Building $i"
    SRCDIR="$CACHEDIR/packaging/$i"
    # fetching the AUR Source
    if [[ ! -d "$CACHEDIR/packaging/$i" ]]; then
        git clone --depth=1 "https://aur.archlinux.org/$i.git" "$CACHEDIR/packaging/$i" || msg_error "Cannot download PKGBUILD"
        cd "$SRCDIR"
    else
        cd "$SRCDIR"
        git reset --hard
        git pull
    fi
    echo -n "${SELF}? Wanna see PKGBUILD? [y/n] "
    read -r q1
    if [[ "$q1" == "y" ]]; then
    	less PKGBUILD
    fi
    echo -n "${SELF}? Start building ${i}? [y/n] "
    read -r prompt
    if [[ ! "$prompt" == "y" ]]; then
    	msg_error "Interrupted!"
    fi
    # Override: srcpatch
    if [[ -d "$CONFIGDIR/overrides/$i/srcpatch" ]];
    then
        msg_info "Patching"
        for j in "$CONFIGDIR/overrides/$i/srcpatch/"*;
        do
	    patch -p1 < "$CONFIGDIR/overrides/$i/srcpatch/$j"
	    msg_info "Patched $j !" || {
                echo -n "$SELF: Failed to patch. Ignore it and continue? [y/n] "
		read -r prompt2
                if [[ ! "$prompt2" == "y" ]]; then
		    msg_error Interrupted
		fi
            }
        done
    fi

    # Override: srccopy
    if [[ -d "$CONFIGDIR/overrides/$i/srccopy" ]];
    then
	cp -rv "$CONFIGDIR/overrides/$i/srccopy/"* "$SRCDIR"
    fi
    # Downloading sources
    makepkg -o
    # Override: copy
    if [[ -d "$CONFIGDIR/overrides/$i/copy" ]];
    then
	cp -rv "$CONFIGDIR/overrides/$i/copy/"* "$SRCDIR/src"
    fi
    cd src/
    # Override: patch
    if [[ -d "$CONFIGDIR/overrides/$i/patch" ]];
    then
        msg_info "Patching"
        for j in "$CONFIGDIR/overrides/$i/patch/"*;
        do
	    patch < "$CONFIGDIR/overrides/$i/patch/$j" &&
	        msg_info "Patched $j !" || {
                    read -rp "Failed Patch $j! Do you want to continue without it? " prompt;
                    [[ $prompt == "n" ]] || [[ $prompt == "no" ]] && exitm 1
                }
        done
    fi
    cd ..
    # Build Package
    makepkg -sci || {
    if [[ "$?" == "1" ]]; then
        read -rp "Do you want to disable verify checks? ${SELF}? [y/n] " prompt
        if [[ $prompt == "y" ]];
        then
	    makepkg -sci --skipinteg;
        fi
    fi
    PACKAGE=$(ls ./*.zst)
    mv "$PACKAGE" "$CACHEDIR/packages/"
    ln -s "$CACHEDIR/packages/$PACKAGE" "$PACKAGE"
    }
}
PACKAGES=""
ARGS=$*
if [[ -z $ARGS ]]
then
    
    sudo pacman -Syu
    for i in $(cat "$CONFIGDIR/Packages");
    do
	install "$i"
    done
else
    FLAGS=""
    PACKAGES=""
    for i in $ARGS;
    do
        [[ $(echo "$i" | cut -c 1) == "-" ]] && FLAGS+="${i}" || PACKAGES+="$i "
    done
    # parsing flags
    SYNC=false
    SEARCH=false
    UPDATE=false
    GIVE_VERSION=false
    [[ -z $FLAGS ]] && FLAGS="-S"
    # echo $FLAGS
    flags_process $FLAGS
    # echo $SYNC $SEARCH $UPDATE
    if $GIVE_VERSION; then
        msg_info "$SELF: $SELF_VERSION"
    fi
    if $SEARCH; then
        for i in "$(echo $PACKAGES | sed 's/ /\n/g')";
        do
            search $i
        done
    elif $SYNC; then
        for i in "$(echo $PACKAGES | sed 's/ /\n/g')";
        do
            install $i
        done
    fi
fi
