#!/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 $AK_LIBDIR/_ak_utils

function _ak_log_print_log_line(){
    if [ -n "$1" ]
    then
        timestamp="$(echo "$*" | awk '{print $1}')"
        program="$(echo "$*" | awk '{print $2}')"
        messagetype="$(echo "$*" | awk '{print $3}')"
        message="$(echo "$*" | cut -d ' ' -f4-)"
        printf '%s \033[1;32m%s\033[0;00m \033[1;31m%s\033[0;00m %s\n' \
            "$(date --date=@$timestamp +%Y%m%d_%H%M%S 2>/dev/null || date -r $timestamp +%Y%m%d_%H%M%S 2>/dev/null)" \
            "$program" \
            "$messagetype" \
            "$message"
    fi
}

function _ak_log_follow(){
    tail -f $AK_LOGSFILE | while read -r p || [ -n "$p" ]
    do
        _ak_log_print_log_line "$p"
    done
}

function _ak_log_grep(){
    if [ ! -z $1 ] && [ -n "$1" ]
    then
        if [ "$1" == "-h" ] || [ "$1" == "--help" ]
        then
            description
            echo "Launch with no arguments and select from the menu that will appear"
            exit 1
        fi
    fi
    echo "The following scripts have entries in the log file."
    echo "Select one of those by entering the number of it below and hit enter:"
    select x in $(cat $AK_LOGSFILE | cut -d ' ' -f 2 | sort | uniq)
    do
        grep $x $AK_LOGSFILE | while read line
        do
            _ak_log_print_log_line "$line"
        done
        break
    done
}

function _ak_log_rotate(){
    if [ -f $AK_LOGSFILE ]
    then
        tar cvfz $AK_ARCHIVESDIR/logs_$(_ak_datetime_unix).tar.gz $AK_WORKDIR/logs
        cat /dev/null > $AK_WORKDIR/logs
    fi
    if [ -f $AK_WORKDIR/akd.log ]
    then
        tar cvfz $AK_ARCHIVESDIR/akd-logs_$(_ak_datetime_unix).tar.gz $AK_WORKDIR/akd.log
        cat /dev/null > $AK_WORKDIR/akd.log
    fi
}

function _ak_log_message(){
    TS="$(_ak_datetime_unix)"
    if [ ! -z $1 ] && [ -n "$1" ]
    then
        prg="$1"
        shift
        if [ ! -z "$1" ] && [ -n "$1" ]
        then
            tp="$1"
            shift
            if [ ! -z "$*" ] && [ -n "$*" ]
            then
                msg="$*"
                echo "$TS" "<$prg>" "[$tp]" "$msg" >> $AK_LOGSFILE
                if [ ! -z $AK_DEBUG ] && [ -n "$AK_DEBUG" ] && [ "$AK_DEBUG" == "yes" ]
                then
                    _ak_log_print_log_line "$TS <$prg> [$tp] $msg" >&2
                fi
            else
                echo "$TS" "<$prg>" "[ERROR]" "No message" >> $AK_LOGSFILE
                if [ "$AK_DEBUG" == "yes" ]
                then
                    echo "$TS" "<$prg>" "[ERROR]" "No message" >&2
                fi
                return 1
            fi
        else
            echo "$TS" "<$prg>" "[ERROR]" "No type and message" >> $AK_LOGSFILE
            if [ "$AK_DEBUG" == "yes" ]
            then
                echo "$TS" "<$prg>" "[ERROR]" "No type and message" >&2
            fi
            return 1
        fi
    else
        echo "$TS" "<$(basename $0)>" "[ERROR]" "No arguments given" >> $AK_LOGSFILE
        if [ "$AK_DEBUG" == "yes" ]
        then
            echo "$TS" "<$(basename $0)>" "[ERROR]" "No arguments given" >&2
        fi
        return 1
    fi
}

function _ak_log_exit(){
    _ak_log_message "$PROGRAM" "EXIT" "$*"
}

function _ak_log_warning(){
    _ak_log_message "$PROGRAM" "WARNING" "$*"
}

function _ak_log_debug(){
    _ak_log_message "$PROGRAM" "DEBUG" "$*"
}

function _ak_log_error(){
    _ak_log_message "$PROGRAM" "ERROR" "$*"
}

function _ak_log_info(){
    _ak_log_message "$PROGRAM" "INFO" "$*"
}

# vim: set syntax=bash