#!/usr/bin/env bash
###
### arching-kaos-tools
### Tools to interact and build an Arching Kaos Infochain
### Copyright (C) 2021 - 2025  kaotisk
###
### 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/>.
###
source ./lib/_ak_log > /dev/null 2>&1 || source $AK_LIBDIR/_ak_log > /dev/null 2>&1

# Wanna talk about it?
function _ak_new_line(){
    printf '\n'
}

function _ak_exit_program(){
# Needs rework:
#    cd $curdir
#    if [ "$3" == "save_log" ]
#    then
#        tar cvfz $curdir/$(basename $tempdir)-$launch_timestamp.tgz $tempdir
#    fi
#    rm -rf $tempdir
    if [ $1 -ne 0 ]
    then
        _ak_log_error "$2 ($1)"
    else
        _ak_log_exit "$2"
    fi
    exit $1
}

function _ak_help(){
    if [ ! -z $fullprogrampath ] && [ -n "$fullprogrampath" ]
    then
        cat $fullprogrampath | grep -v '^###' | grep '^##'| sed 's/^##//g;s/^ //g' >&2
        exit 1
    else
        _ak_log_error "fullprogrampath was not set"
        exit 1
    fi
}

function _ak_license(){
    if [ ! -z $fullprogrampath ] && [ -n "$fullprogrampath" ]
    then
        cat $fullprogrampath | grep '^###' | sed 's/^###//g;s/^ //g' >&2
    else
        _ak_log_error "fullprogrampath was not set"
        exit 1
    fi
}

function _ak_title_description(){
    if [ ! -n "$descriptionString" ]
    then
        # Choose to exit with error to enforce standard
        _ak_log_error "No description string"
        exit 1
        # Alternative solution
        # full_title="$(printf '%s' "$PROGRAM")"
    fi
    full_title="$(printf '%s - %s' "$PROGRAM" "$descriptionString")"
    delimiter_count=`echo -n $full_title | wc -c`
    (
    printf '%s' "$full_title"
    _ak_new_line
    while [ $delimiter_count -gt 0 ]
    do
        printf '='
        delimiter_count=$(($delimiter_count-1))
    done
    _ak_new_line ) 1>&2
}

function _ak_usage(){
    (
        _ak_title_description 2>&1
        _ak_license 2>&1
        _ak_help 2>&1
    ) | sed 's/^/# /g' | while read line; do _ak_log_info "${line}"; done
}

function _ak_print_version(){
    git_repo="$(ls -l $AK_LIBDIR/_ak_script | cut -d '>' -f 2 | sed 's/^ //' | rev | cut -d '/' -f 3- | rev)"
    patch_version="$(git --git-dir="${git_repo}/.git" -P log --reverse --oneline --decorate | tail -n 1 | cut -d ' ' -f 1)"
    gtags="$(git --git-dir="${git_repo}/.git" -P tag | tail -n 1)"
    if [ -f "$AK_WORKDIR/version" ]
    then
        cat $AK_WORKDIR/version
    elif [ -n "${gtags}" ]
    then
        echo "${gtags}"
    else
        echo "v0.0.0-${patch_version}"
    fi
}

function _ak_version(){
    printf '%s - ' "$PROGRAM"
    _ak_print_version 2>&1
}

function _ak_not_implemented(){
    #_ak_title_description
    _ak_log_error "Not implemented: $*"
}

function _ak_make_temp_directory(){
    AK_TEMP="$(mktemp -d /tmp/aktmp-XXXXXXX)"
    if [ ! -d "$AK_TEMP" ]
    then
        _ak_log_error "Could not make $AK_TEMP directory to work in"
        exit 1
    fi
    _ak_log_info "Directory $AK_TEMP created successfully"
    echo "$AK_TEMP"
}

function _ak_make_temp_file(){
    AK_TEMP="$(mktemp /tmp/aktmp-XXXXXXX)"
    if [ ! -f "$AK_TEMP" ]
    then
        _ak_log_error "Could not make $AK_TEMP file to work in"
        exit 1
    fi
    _ak_log_info "File $AK_TEMP created successfully"
    echo "$AK_TEMP"
}

function _ak_check_and_create_dir(){
    if [ ! -z "$1" ] && [ -n "$1" ] && [ ! -d "$1" ]
    then
        mkdir -p "$1"
        if [ $? -eq 0 ]
        then
            _ak_log_info "Directory $1 created!"
        else
            _ak_log_error "Problem occured while creating $1"
            exit 1
        fi
    else
        _ak_log_debug "$1 dir found"
    fi
}

function _ak_let_there_be_file(){
    if [ ! -f "$1" ]
    then
        touch "$1"
        if [ $? -eq 0 ]
        then
            _ak_log_info "File $1 created!"
        else
            _ak_log_error "Problem occured while creating $1"
            exit 1
        fi
    else
        _ak_log_debug "$1 file found"
    fi
}

function _ak_init_file_as_json_array(){
    if [ ! -f "$1" ]
    then
        printf "[]" > $1
        if [ $? -eq 0 ]
        then
            _ak_log_info "File $1 created!"
        else
            _ak_log_error "Problem occured while creating $1"
            exit 1
        fi
    else
        _ak_log_debug "$1 file found"
    fi
}

function _ak_countdown_seconds(){
    default_countdown=5
    if [ ! -z "$1" ] && [ -n "$1" ]
    then
        if [ "$(echo -n $1 | sed -e 's/^[0-9]*$//g')" == "" ]
        then
            countdown=$1
        else
            countdown=${default_countdown}
        fi
    else
        countdown=${default_countdown}
    fi
    printf " %s" "$countdown"
    countdown="$(expr $countdown - 1)"
    sleep 1
    while [ $countdown -gt 0 ]
    do
        if [ $countdown -lt 10 ]
        then
            printf "\b\b %s" "$countdown"
        else
            printf "\b\b%s" "$countdown"
        fi
        countdown="$(expr $countdown - 1)"
        sleep 1
    done
    printf "\b\b starting!!!"
    sleep 1
    printf "\n"
}