#!/usr/bin/env bash

# @brief Execute the command and save the output into the dreport
#        packaging, if it is in the user allowed dump size limit.
# @param $1 Command to be executed.
# @param $2 Save file name.
# @param $3 Plugin description used for logging.
function add_cmd_output()
{
    command="$1"
    file_name="$2"
    desc="$3"

    eval $command >> "$name_dir/$file_name"
    if [ $? -ne 0 ]; then
        log_error "Failed to collect $desc"
        return 1
    fi

    if check_size "$name_dir/$file_name"; then
        log_info "Collected $desc"
    else
        log_warning "Skipping $desc"
    fi
}

# @brief Copy the file or directory into the dreport packaging,
#        if it is in the user allowed dump size limit.
# @param $1 Copy file or directory name.
# @param $2 Plugin description used for logging.
function add_copy_file()
{
    file_name="$1"
    desc="$2"

    cp -r $file_name $name_dir
    if [ $? -ne 0 ]; then
        log_error "Failed to copy $desc $file_name"
        return $RESOURCE_UNAVAILABLE
    fi
    if check_size "$name_dir/$(basename "$file_name")"; then
        log_info "Copied $desc $file_name"
        return $SUCCESS
    else
        return $RESOURCE_UNAVAILABLE
        log_warning "Skipping copy $desc $file_name"
    fi
}
# @brief Copy the symbolic link file to the dreport packaging,
#        if it is in the user allowed dump size limit.
# @param $1 symbolic link file name
# @param $2 Plugin description used for logging.
function add_copy_sym_link_file()
{
    file_name="$1"
    desc="$2"

    cp $file_name $name_dir
    if [ $? -ne 0 ]; then
        log_error "Failed to copy $desc $file_name"
        return $RESOURCE_UNAVAILABLE
    fi
    if check_size "$name_dir/$(basename "$file_name")"; then
        log_info "Copied $desc $file_name"
        return $SUCCESS
    else
        log_warning "Skipping copy $desc $file_name"
        return $RESOURCE_UNAVAILABLE
    fi
}

# @brief Calculate file or directory compressed size based on input
#        and check whether the size in the allowed size limit.
#        Remove the file or directory from the name_dir
#        if the check fails.
# @param $1 Source file or directory
# @return 0 on success, error code if size exceeds the limit.
# Limitation: compress and tar will have few bytes size difference
function check_size()
{
    source=$1

    #No size check required in case dump_size is set to unlimited
    if [ $dump_size = $UNLIMITED ]; then
        return 0
    fi

    #get the file or directory size
    if [[ -d $source ]] && [[ -n $source ]]; then
        tar -cf "$source.tar" -C \
                 $(dirname "$source") $(basename "$source")
        size=$(stat -c%s "$source.tar")
        rm "$source.tar"
    else
        size=$(stat -c%s "$source")
    fi

    if [ $((size + cur_dump_size)) -gt $dump_size ]; then
        #Exceed the allowed limit,
        #tar and compress the files and check the size
        tar -Jcf "$name_dir.tar.xz" -C \
                  $(dirname "$name_dir") $(basename "$name_dir")
        size=$(stat -c%s "$name_dir.tar.xz")
        if [ $size -gt $dump_size ]; then
            #Remove the the specific data from the name_dir and continue
            rm "$source" "$name_dir.tar.xz"
            return $RESOURCE_UNAVAILABLE
        else
            rm "$name_dir.tar.xz"
        fi
    fi

    cur_dump_size=$((size + cur_dump_size))
    return $SUCCESS
}

# @brief log the error message
# @param error message
function log_error()
{
   echo $($TIME_STAMP) "ERROR: $@" >> $dreport_log
   if ((quiet != TRUE)); then
      echo $($TIME_STAMP) "ERROR: $@" >&2
   fi
}

# @brief log warning message
# @param warning message
function log_warning()
{
    if ((verbose == TRUE)); then
        echo $($TIME_STAMP) "WARNING: $@" >> $dreport_log
        if ((quiet != TRUE)); then
            echo $($TIME_STAMP) "WARNING: $@" >&2
        fi
    fi
}

# @brief log info message
# @param info message
function log_info()
{
    if ((verbose == TRUE)); then
        echo $($TIME_STAMP) "INFO: $@" >> $dreport_log
        if ((quiet != TRUE)); then
            echo $($TIME_STAMP) "INFO: $@" >&1
        fi
    fi
}

# @brief log summary message
# @param message
function log_summary()
{
    echo $($TIME_STAMP) "$@" >> $summary_log
    if ((quiet != TRUE)); then
        echo $($TIME_STAMP) "$@" >&1
    fi
}
