
#!/bin/bash
cd "$(dirname "$(readlink -f "$0")")"

G_DIR="../log"
LOG_DIR=${G_DIR}


# Help function
function help() {
    echo -e "Usage: \n\t$(basename "$0")  <program_name> {-t|-d|-i|-w|-e|-f}\n"
    echo -e "       \t$(basename "$0")   [-t|-d|-i|-w|-e|-f]   program_name \n"
    echo -e "\t  -t|-v : \t Extract lines with [T]race level:    6 "
    echo -e "\t  -d    : \t Extract lines with [D]ebug level:    5 "
    echo -e "\t  -i    : \t Extract lines with [I]nfo level:     4 "
    echo -e "\t  -w    : \t Extract lines with [W]arn level:     3 "
    echo -e "\t  -e    : \t Extract lines with [E]rror level:    2 "
    echo -e "\t  -c|-f : \t Extract lines with [C]ritical(Fault) 1 "
    echo -e "\t  -err  : \t Extract lines with [E]rror level: 2 for error.log"
    echo -e "\t  -clear: \t Clear the log file for the specified program, but Reverse error.log"
    echo -e "\t  -g    : \t Get <program> log level:\t manage logic tcpcomm uartcomm ..."
    echo -e "\t  -s <L>: \t Set <program> log level x: [1-C, 2-E, 3-W, 4-I, 5-D, 6-T] "
    echo -e ""
}

# Clear log file function
function clear_log() {
    local program_name=$1
    log_file="${LOG_DIR}/$program_name/$program_name.log"
    log_err_file="${LOG_DIR}/$program_name/${program_name}_error.log"
    if [ -f "$log_file" ]; then
        > "$log_file"
        echo "Log file for $program_name cleared."
    #    > "$log_err_file"
    #    echo "Log file for ${program_name}_error cleared."
    else
        echo "Log file for $program_name does not exist."
    fi
}

# Extract log function
function extract_log() {
    local level=$1
    local program_name=$2
    #log_file="${LOG_DIR}/$program_name/$program_name.log"
    log_file="$(ls -t ${LOG_DIR}/$program_name/${program_name}*.log|head -n1)"
    log_err_file="$(ls -t ${LOG_DIR}/$program_name/${program_name}_error.log|head -n1)"

    if [ -f "$log_file" ]; then

        case "$level" in
            T|t|Trace|trace|V|v|Verbose|verbose)
                tail -f "$log_file" 	#| grep -E "\[T|Trace\]"
                ;;
            D|d|Debug|debug)
                tail -f "$log_file" | grep -vE "\[T|Trace\]"	#| grep -E "\[D|Debug\]"
                ;;
            I|i|Info|info)
                tail -f "$log_file" | grep -vE "\[T|Trace\]|\[D|Debug\]"	# | grep -E "\[I|Info\]"
                ;;
            W|w|Warn|warn)
                tail -f "$log_file" | grep -vE "\[T|Trace\]|\[D|Debug\]|\[I|Info\]"		# | grep -E "\[W|Warn\]"
                ;;
            E|e|Error)
                tail -f "$log_file" | grep -vE "\[T|Trace\]|\[D|Debug\]|\[I|Info\]|\[W|Warn\]"		# | grep -E "\[E|Error\]"
                ;;
            err|error)
                tail -f "$log_err_file"
                ;;
            C|c|Critical|critical|F|f|Fault|fault)
                tail -f "$log_file" | grep -E "\[C|Critical\]"
                ;;
            *)
                help
                exit 1
                ;;
        esac
    else
        echo "Log file for $program_name does not exist."
    fi
}

# Extract log function
function level_log() {
    local cmd=$1
    local program_name=$2
    local level=$3
    log_file="${LOG_DIR}/$program_name/$program_name.log"
	lv_file="/tmp/prlog/level/$program_name"
	#
	if [[ "${BASH_VERSINFO:-0}" -lt 4 ]]; then
		echo "此脚本需要 Bash 4.0 或更高版本" >&2
	#	exit 1
	fi
	# 声明一个关联数组
	declare -A my_array
	# 给数组赋值
	my_array[0]="Off"
	my_array[1]="Critical"
	my_array[2]="Error"
	my_array[3]="Warn"
	my_array[4]="Info"
	my_array[5]="Debug"
	my_array[6]="Trace"

    if [ -f "$log_file" ]; then
        case "$cmd" in
            Get)
                level="`cat ${lv_file}`" 	#| grep -E "\[T|Trace\]"
				strLv=${my_array[${level}]}
                echo "get level ${level}: [${strLv:0:1}] [${strLv}]"
                ;;
            Set)
                echo "${level}" > "$lv_file"
				strLv=${my_array[${level}]}
                echo "set to level ${level}: [${strLv:0:1}] [${strLv}]"
                ;;
            *)
                help
                exit 1
                ;;
        esac
    else
        echo "Log file for $program_name does not exist."
    fi
}
# Check if correct number of arguments is passed
if [ "$#" -lt 1 ]; then
    help
    exit 1
fi

# Parse options and arguments
program_name=$1
option=$2
level=$3

# swap $1 $2
if [[ "$1" = -* ]];then
	option=$1
	program_name=$2
fi

#echo "1: [$1]  2: [$2]  3: [$3] "
#echo "option = ${option}"
#echo "program_name = $program_name"
#echo "level = $level"


if [[ ${option} =~ ^-s[0-9]$ ]]; then
	level=${option#-s}
	option="-s"
fi
# 动态等级
log_setlv=/tmp/prlog/level/${program_name}

case "$option" in
    -v|--verbose)
        echo 6 > ${log_setlv}
        extract_log "V" "$program_name"
        ;;
    -t|--trace)
        echo 6 > ${log_setlv}
        extract_log "V" "$program_name"
        ;;
    -d|--debug)
        echo 5 > ${log_setlv}
        extract_log "D" "$program_name"
        ;;
    -i|--info)
        echo 4 > ${log_setlv}
        extract_log "I" "$program_name"
        ;;
    -w|--warn)
        echo 3 > ${log_setlv}
        extract_log "W" "$program_name"
        ;;
    -err|--err)
        echo 2 > ${log_setlv}
        extract_log "err" "$program_name"
        ;;
    -e*|--error)
        echo 2 > ${log_setlv}
        extract_log "E" "$program_name"
        ;;
    -c|--critical)
        echo 1 > ${log_setlv}
        extract_log "C" "$program_name"
        ;;
    -f|--fault)
        echo 1 > ${log_setlv}
        extract_log "C" "$program_name"
        ;;
    -clear|--clear)
        clear_log "$program_name"
        ;;
     -g*|--get)
        level_log "Get" "$program_name" "${level}"
        ;;
     -s|-set|--set)
        level_log "Set" "$program_name" "${level}"
        ;;
    *)
        echo "[$@]"
		if [ -z "$option" ];then
			extract_log "V" "$program_name"
		fi
        help
        exit 1
        ;;
esac


