# shellcheck shell=dash disable=SC2016


___x_cmd_claw_run_ls(){
    local imdir="$___X_CMD_CLAW_BOT_CONNECT_DIR"
    if [ ! -d "$imdir" ]; then
        printf "im: []\n"
        return 0
    fi

    printf "im:\n"
    local i j im_name chatid active_ts last_active
    for i in "$imdir"/*; do
        [ -d "$i" ] || continue
        im_name="${i##*/}"
        for j in "$i"/*; do
            [ -f "$j" ] || continue
            chatid="${j##*/}"
            active_ts=""
            read -r active_ts < "$j"

            last_active=""
            if [ -n "$active_ts" ] && [ "$active_ts" -gt 0 ] 2>/dev/null; then
                last_active="$(___x_cmd date iso "$active_ts" 2>/dev/null)"
            fi

            printf "  - name: %s\n" "$im_name"
            printf "    chatid: %s\n" "$chatid"
            [ -n "$last_active" ] && printf "    last_active: %s\n" "$last_active"
        done 2>/dev/null
    done 2>/dev/null
}

___x_cmd_claw_run_status(){
    local runtime_status="inactive"
    ___x_cmd worker isalive --ns x-claw-default-worker --name heartbeat-runner && runtime_status="active"

    local heartbeat_runner="dead" heartbeat_worker="idle"
    ___x_cmd worker isalive --ns x-claw-default-worker --name heartbeat-runner && heartbeat_runner="alive"
    ___x_cmd worker isalive --ns x-claw-default-worker --name x-claw-heartbeat && heartbeat_worker="running"

    local idle_count=0
    local idle_file="$___X_CMD_CLAW_BOT_HEARTBEAT/idle_count"
    [ ! -f "$idle_file" ] || read -r idle_count < "$idle_file"

    local agent_available="yes"
    [ ! -f "$___X_CMD_CLAW_BOT_HEARTBEAT/agent_unavailable" ] || agent_available="no"

    local last_tick="" lastheartbeat_ts=0
    local heartbeat_tsfile="$___X_CMD_CLAW_BOT_HEARTBEAT/lastheartbeat_ts"
    if [ -f "$heartbeat_tsfile" ]; then
        read -r lastheartbeat_ts < "$heartbeat_tsfile"
        [ "$lastheartbeat_ts" -gt 0 ] 2>/dev/null && {
            last_tick="$(___x_cmd date iso "$lastheartbeat_ts" 2>/dev/null)"
        }
    fi

    printf "runtime: %s\n" "$runtime_status"

    local harness=""
    x_=""; ___x_cmd agent default_harness_ 2>/dev/null && harness="$x_"
    [ -n "$harness" ] && printf "agent_harness: %s\n" "$harness"

    printf "heartbeat:\n"
    printf "  worker: %s\n" "x-claw-heartbeat"
    printf "  worker_status: %s\n" "$heartbeat_worker"
    printf "  runner_status: %s\n" "$heartbeat_runner"
    printf "  idle_count: %s\n" "$idle_count"
    printf "  agent_available: %s\n" "$agent_available"
    [ -n "$last_tick" ] && printf "  last_tick: %s\n" "$last_tick"

    printf "workspace: %s\n" "$___X_CMD_CLAW_BOT_WS"
    printf "log_dir: %s\n" "$___X_CMD_CLAW_BOT_STDOUT_LOG_DIR"

    local mq_pending=0 f
    if [ -d "$___X_CMD_CLAW_BOT_MQ" ]; then
        for f in "$___X_CMD_CLAW_BOT_MQ"/*; do
            [ -f "$f" ] && mq_pending=$((mq_pending + 1))
        done 2>/dev/null
    fi
    printf "mq_pending: %s\n" "$mq_pending"

    local imdir="$___X_CMD_CLAW_BOT_CONNECT_DIR"
    local i j im_name chatid active_ts worker_name worker_status service_status unread_count last_active
    printf "im:\n"
    if [ -d "$imdir" ]; then
        for i in "$imdir"/*; do
            [ -d "$i" ] || continue
            im_name="${i##*/}"
            service_status="$(___x_cmd_claw_run___im_service_status "$im_name" 2>/dev/null)"
            [ -n "$service_status" ] || service_status="unknown"
            if ___x_cmd fsiter --dirempty "$i"; then
                printf "  - name: %s\n" "$im_name"
                printf "    service_status: %s\n" "$service_status"
                printf "    status: no_active_chat\n"
            else
                for j in "$i"/*; do
                    [ -f "$j" ] || continue
                    chatid="${j##*/}"
                    active_ts=""
                    read -r active_ts < "$j"

                    worker_name="${im_name}-${chatid}"
                    if ___x_cmd worker isalive --ns x-claw-default-worker --name "$worker_name"; then
                        worker_status="processing"
                    else
                        worker_status="idle"
                    fi

                    service_status="$(___x_cmd_claw_run___im_service_status "$im_name" "$chatid" 2>/dev/null)"
                    [ -n "$service_status" ] || service_status="unknown"

                    unread_count=""
                    case "$im_name" in
                        weixin)     unread_count="$(___x_cmd claw weixin unread-count 2>/dev/null)" ;;
                        telegram|qywx|feishu)
                                    unread_count="$(___x_cmd claw "$im_name" unread-count "$chatid" 2>/dev/null)" ;;
                    esac
                    [ -n "$unread_count" ] && [ "$unread_count" -ge 0 ] 2>/dev/null || unread_count=0

                    last_active=""
                    if [ -n "$active_ts" ] && [ "$active_ts" -gt 0 ] 2>/dev/null; then
                        last_active="$(___x_cmd date iso "$active_ts" 2>/dev/null)"
                    fi

                    printf "  - name: %s\n" "$im_name"
                    printf "    chatid: %s\n" "$chatid"

                    local chat_type="" app_name="" group_name=""
                    case "$im_name" in
                        feishu)
                            case "$chatid" in
                                oc_*)   chat_type="group"
                                        group_name="$( ___x_cmd feishu group info --json --chatid "$chatid" 2>/dev/null | ___x_cmd jo .data.name )"
                                        printf "    group_name: %s\n" "$group_name" ;;

                                *)      chat_type="single"
                                        app_name="$( ___x_cmd feishu abot info --appid me 2>/dev/null | ___x_cmd jo .data.app.app_name )"
                                        printf "    app_name: %s\n" "$app_name" ;;
                            esac
                            ;;
                    esac
                    printf "    type: %s\n" "$chat_type"
                    printf "    worker: %s\n" "$worker_name"
                    printf "    worker_status: %s\n" "$worker_status"
                    printf "    service_status: %s\n" "$service_status"
                    printf "    unread_count: %s\n" "$unread_count"
                    [ -n "$last_active" ] && printf "    last_active: %s\n" "$last_active"
                done 2>/dev/null
            fi
        done 2>/dev/null
    fi

    printf "cron:\n"

    local cron_tz=""
    cron_tz="$(___x_cmd_claw_cron tz 2>/dev/null)" || cron_tz=""
    [ -n "$cron_tz" ] && printf "  tz: %s\n" "$cron_tz"

    local cron_list=""
    cron_list="$(___x_cmd_claw_cron_ls --tsv 2>/dev/null)" || cron_list=""
    if [ -n "$cron_list" ]; then
        printf "%s" "$cron_list" | ___x_cmd awk0 -m date -v FS="$___X_CMD_UNSEENCHAR_HT" '
BEGIN { first = 1 }
{
    if (first) { first = 0; next }
    name = $1
    if (name == "") next

    print "  - name: " name
    print "    expr: " $2
    if ($3 != "") print "    desc: " $3
    if ($4 != "") print "    once: " $4

    last_start = $5
    if (last_start != "" && last_start > 0) {
        last_start_iso = date_timestamp_to_iso(last_start)
        if (last_start_iso != "") {
            print "    last_start: " last_start_iso

            last_end = $6
            if (last_end != "" && last_end > 0) {
                last_end_iso = date_timestamp_to_iso(last_end)
                if (last_end_iso != "") print "    last_end: " last_end_iso
            }

            if ($7 != "") print "    last_status: " $7
            if ($8 != "") print "    last_exit_code: " $8
        }
    }
}
'
    else
        printf "  []\n"
    fi
}
