#!/bin/bash

# Prevent execution as root user
if [ "$(id -u)" -eq 0 ]; then
    echo "Error: DataKit cannot be executed as root user"
    echo "Please run with a regular user: su <username> "
    exit 1
fi

umask 027

APP_NAME="datakit"
JAR_PATTERN="openGauss-datakit-*.jar"
PID_FILE="datakit.pid"
LOG_DIR="logs"
LOG_FILE="${LOG_DIR}/visualtool-main.out"

mkdir -p "${LOG_DIR}"

get_jar_path() {
    local jar_file=$(ls -t ${JAR_PATTERN} 2>/dev/null | head -n 1)
    if [ -z "${jar_file}" ]; then
        echo "error : No matching JAR file found."
        exit 1
    fi

    if [ -f "${jar_file}" ]; then
        echo $(realpath "${jar_file}")
    else
        echo "error : JAR file not exist : ${jar_file}"
        exit 1
    fi
}

refresh_pid() {
    JAR_FILE=$(get_jar_path)
    PID=$(ps aux | grep java | grep -F -- "${JAR_FILE}" | grep -v grep | awk '{print $2}' | head -n 1)
    if [ -n "${PID}" ]; then
        echo "${PID}" > "${PID_FILE}"
    else
        rm -f "${PID_FILE}"
    fi
}

check_and_fix_log_permissions() {
    LOG_DIR="logs"
    EXPECTED_FILE_PERM="640"
    EXPECTED_DIR_PERM="750"

    echo "check log files and dir permissions..."

    if [ -d "$LOG_DIR" ]; then
        local dir_perm=$(stat -c "%a" "$LOG_DIR")
        if [ "$dir_perm" != "$EXPECTED_DIR_PERM" ]; then
            echo "  fixed log dir permissions: $dir_perm -> $EXPECTED_DIR_PERM"
            chmod "$EXPECTED_DIR_PERM" "$LOG_DIR"
        fi
    fi

    find "$LOG_DIR" -name "*.log" -type f 2>/dev/null | while read -r log_file; do
        local file_perm=$(stat -c "%a" "$log_file")
        if [ "$file_perm" != "$EXPECTED_FILE_PERM" ]; then
            echo "  fixed log files permissions: $log_file ($file_perm -> $EXPECTED_FILE_PERM)"

            if lsof "$log_file" >/dev/null 2>&1; then
                echo "  warn: file is used ,not fixed permissions: $log_file"
            else
                chmod "$EXPECTED_FILE_PERM" "$log_file"
            fi
        fi
    done

    umask 027
}

start_up() {
    JAR_FILE=$(get_jar_path)

    if [ -z "${DATA_KIT_AES_KEY}" ]; then
        echo "error : DATA_KIT_AES_KEY environment variable is not set."
        echo "        Please set it with --aes-key option"
        exit 1
    fi

    check_and_fix_log_permissions

    DEFAULT_JAVA_OPTS="-Xms2048m -Xmx4096m"
    JAVA_OPTS=${JAVA_OPTS:-$DEFAULT_JAVA_OPTS}
    echo "Starting ${APP_NAME} with DATA_KIT_AES_KEY..."
    export DATA_KIT_AES_KEY=${DATA_KIT_AES_KEY}
    nohup java ${JAVA_OPTS} -Dlog4j.configurationFile=./config/log4j2.xml -jar "${JAR_FILE}" --spring.profiles.active=temp > "${LOG_FILE}" 2>&1 &

    echo $! > "${PID_FILE}"
    echo "${APP_NAME} started. PID: $(cat ${PID_FILE})"
}

start() {
    refresh_pid

    if [ -s "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p "${PID}" > /dev/null; then
            echo "Datakit is already running with PID : ${PID}"
            exit 1
        else
            echo "Stale PID file. Cleaning up."
            rm -f "${PID_FILE}"
        fi
    fi

    start_up
}

stop() {
    refresh_pid

    if [ -s "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        kill -9 "${PID}" >/dev/null 2>&1
        rm -f "${PID_FILE}"
        echo "${APP_NAME} stopped."
    else
        echo "${APP_NAME} is not running."
    fi
}

restart() {
    stop
    sleep 2
    start_up
}

status() {
    refresh_pid

    if [ -s "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p "${PID}" > /dev/null; then
            echo "status : ${APP_NAME} is running with PID: ${PID}"
            echo "JAR PATH : $(get_jar_path)"
        else
            echo "warn : Stale PID file, ${APP_NAME} may not be running."
            rm -f "${PID_FILE}"
        fi
    else
        echo "status : ${APP_NAME} is not running."
    fi
}

show_help() {
    echo "Usage: $0 {start|stop|restart|status} [--aes-key <key>]"
    echo "Commands:"
    echo "  start              Start datakit service"
    echo "  stop               Stop datakit service"
    echo "  restart            Restart datakit service"
    echo "  status             Show service status"
    echo ""
    echo "Options:"
    echo "  --aes-key <key>    Set DATA_KIT_AES_KEY for this session"
    echo ""
    echo "Environment:"
    echo "  If DATA_KIT_AES_KEY is already set in environment,"
    echo "  --aes-key option will be ignored"
}

COMMAND="$1"
shift

while [[ $# -gt 0 ]]; do
    case "$1" in
        --aes-key)
            if [[ -z "$2" || "$2" == --* ]]; then
                echo "Error: --aes-key requires a value"
                show_help
                exit 1
            fi

            if [ -z "${DATA_KIT_AES_KEY}" ]; then
                export DATA_KIT_AES_KEY="$2"
                echo "Using command-line AES key"
            else
                echo "Warning: DATA_KIT_AES_KEY already set in environment. Ignoring --aes-key option"
            fi
            shift 2
            ;;
        *)
            echo "Unknown option: $1"
            show_help
            exit 1
            ;;
    esac
done

case "${COMMAND}" in
    start)
        if [ -z "${DATA_KIT_AES_KEY}" ]; then
            echo "Error: AES key is required for 'start' command"
            echo "Set it via:"
            echo "  export DATA_KIT_AES_KEY='your_key'"
            echo "Or use: $0 start --aes-key your_key"
            exit 1
        fi

        if [ ${#DATA_KIT_AES_KEY} -lt 6 ]; then
            echo "Error: AES key must be at least 6 characters"
            exit 1
        fi

        echo "Starting service with AES key (length: ${#DATA_KIT_AES_KEY})"
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    help|--help|-h)
        show_help
        ;;
    *)
        echo "Unknown command: ${COMMAND}"
        show_help
        exit 1
        ;;
esac

exit 0