#!/bin/bash
if ! type "include" > /dev/null 2>&1; then
  include() {
  . "$(cd "$(dirname "$1")" && pwd)/${2}";
  };
fi

include "${BASH_SOURCE[0]}" ../../pragma_once.bash
if ! pragma_once ${BASH_SOURCE[0]}; then return 0;
  source ../../pragma_once.bash
fi





# 这个文件是构建的基础文件 存放最顶层的函数
RESET='\033[0m'  # 重置颜色
BLACK='\033[0;30m'
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[0;37m'
BOLD_BLACK='\033[1;30m'
BOLD_RED='\033[1;31m'
BOLD_GREEN='\033[1;32m'
BOLD_YELLOW='\033[1;33m'
BOLD_BLUE='\033[1;34m'
BOLD_PURPLE='\033[1;35m'
BOLD_CYAN='\033[1;36m'
BOLD_WHITE='\033[1;37m'
export LOG_LEVEL="${LOG_LEVEL:-3}"               # 0=ERROR 1=WARN 2=INFO 3=DEBUG 4=TRACE
export LOG_PATH="${LOG_PATH:-}"                  # 空则不写文件
export LOG_STDOUT="${LOG_STDOUT:-1}"             # 1 输出终端
export LOG_COLOR_STDOUT="${LOG_COLOR_STDOUT:-1}" # 默认是否彩色
export LOG_INIT_MODE="${LOG_INIT_MODE:-rotate}" # truncate|append|rotate
export LOG_INITIALIZED=0


log_init() {
  # 如果没有设置 LOG_PATH，直接返回
  [[ -z "$LOG_PATH" ]] && return 0

  # 如果已经初始化过，直接返回
  (( LOG_INITIALIZED )) && return 0

  # 获取日志文件的目录
  local log_dir
  log_dir=$(dirname "$LOG_PATH")

  # 确保日志文件的目录存在，如果不存在则创建
  if [[ ! -d "$log_dir" ]]; then
    mkdir -p "$log_dir" || { echo "ERROR: Failed to create log directory: $log_dir"; exit 1; }
  fi

  # 确保日志文件存在，如果不存在则创建
  if [[ ! -f "$LOG_PATH" ]]; then
    touch "$LOG_PATH" || { echo "ERROR: Failed to create log file: $LOG_PATH"; exit 1; }
    chmod 777 $LOG_PATH
  fi

  # 根据初始化模式进行操作
  case "$LOG_INIT_MODE" in
  truncate)
    : > "$LOG_PATH"  # 清空日志文件
    ;;
  append)
  # 保持原样，直接追加
    ;;
  rotate)
  # 如果日志文件存在，重命名为带时间戳的文件
    if [[ -f "$LOG_PATH" ]]; then
      mv "$LOG_PATH" "$LOG_PATH.$(date +%Y%m%d_%H%M%S)"
    fi
    ;;
  *)
    echo "Invalid LOG_INIT_MODE: $LOG_INIT_MODE"
    exit 1
    ;;
  esac

  # 标记为已初始化
  LOG_INITIALIZED=1
}
log() {

  log_init

  local level_name="$1"
  local level_num="$2"
  local use_color="$3"
  shift 3

  (( level_num > LOG_LEVEL )) && return 0

  local fmt="$1"
  shift

  local body

  printf -v body -- "$fmt" "$@"
  local timestamp
  #timestamp="$(date '+%Y-%m-%d %H:%M:%S')"

  timestamp="$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')"

  local msg
  printf -v msg "[%s] [%s] %s" \
    "$timestamp" \
    "$level_name" \
    "$body"

  # -------- stdout --------
  if (( LOG_STDOUT )); then

    local enable_color

    if [[ -z "$use_color" ]]; then
      enable_color="$LOG_COLOR_STDOUT"
    else
      enable_color="$use_color"
    fi

    if (( enable_color )) && [[ -t 1 ]]; then

      local color=""
      case "$level_name" in
      ERROR) color="$BOLD_RED" ;;
      WARN)  color="$BOLD_YELLOW" ;;
      INFO)  color="$GREEN" ;;
      DEBUG) color="$CYAN" ;;
      TRACE) color="$PURPLE" ;;
      *)     color="$WHITE" ;;
      esac

      printf "%b%s%b\n" "$color" "$msg" "$RESET"
    else
      printf "%s\n" "$msg"
    fi
  fi

  # -------- file --------
  if [[ -n "$LOG_PATH" ]]; then
    printf "%s\n" "$msg" >> "$LOG_PATH"
  fi
}


log_error() { log ERROR 0 1 "$@"; }
log_warn()  { log WARN  1 1 "$@"; }
log_info()  { log INFO  2 1 "$@"; }
log_debug() { log DEBUG 3 1 "$@"; }
log_trace() { log TRACE 4 1 "$@"; }


