#!/bin/sh

# Best-effort, privacy-bounded monotonic action trace. This file is sourced by
# the package scripts; it never writes to stdout/stderr and logging failures
# must never affect the caller's control flow or exit status.
KSS_ACTION_TIMING_LOG="$BASE/action-timing.log"
KSS_FLOW_FILE="${KSS_FLOW_FILE:-$BASE/run/open-flow.id}"
KSS_TRACE_FLOW_FILE="${KSS_TRACE_FLOW_FILE:-$BASE/run/trace-flow.id}"

kss_flow_id_is_valid() {
    kss_flow_value="$1"
    case "$kss_flow_value" in
        f????????)
            kss_flow_hex="${kss_flow_value#f}"
            case "$kss_flow_hex" in
                *[!0-9a-f]*) return 1 ;;
            esac
            return 0
            ;;
        f*-*)
            kss_flow_numeric="${kss_flow_value#f}"
            kss_flow_uptime="${kss_flow_numeric%%-*}"
            kss_flow_pid="${kss_flow_numeric#*-}"
            [ "$kss_flow_pid" != "$kss_flow_numeric" ] || return 1
            case "$kss_flow_uptime:$kss_flow_pid" in
                :*|*:|*[!0-9:]*) return 1 ;;
            esac
            [ "${#kss_flow_uptime}" -le 10 ] && [ "${#kss_flow_pid}" -le 10 ]
            return $?
            ;;
        *) return 1 ;;
    esac
}

kss_flow_id_read_file() {
    kss_flow_path="$1"
    [ -r "$kss_flow_path" ] || return 1
    IFS= read -r kss_flow_value 2>/dev/null < "$kss_flow_path" || return 1
    kss_flow_id_is_valid "$kss_flow_value" || return 1
    printf '%s\n' "$kss_flow_value"
}

kss_active_flow_id_read() {
    kss_flow_id_read_file "$KSS_FLOW_FILE"
}

kss_flow_id_read() {
    kss_active_flow_id_read 2>/dev/null || kss_flow_id_read_file "$KSS_TRACE_FLOW_FILE"
}

kss_flow_is_current() {
    kss_flow_expected="$1"
    kss_flow_id_is_valid "$kss_flow_expected" || return 1
    kss_flow_current="$(kss_active_flow_id_read)" || return 1
    [ "$kss_flow_current" = "$kss_flow_expected" ]
}

if ! kss_flow_id_is_valid "${KSS_FLOW_ID:-}"; then
    KSS_FLOW_ID="$(kss_flow_id_read 2>/dev/null)" || KSS_FLOW_ID=""
fi
export KSS_FLOW_ID

kss_timing_event() {
    kss_timing_stage="$1"
    case "$kss_timing_stage" in
        start_feedback_begin|start_feedback_ok|start_feedback_fail|start_feedback_timeout|\
        open_prepare_begin|open_prepare_ok|open_prepare_fail|\
        open_flow_store_begin|open_flow_store_ok|open_flow_store_fail|\
        open_mark_active_begin|open_mark_active_ok|open_mark_active_fail|\
        open_wrapper_begin|open_start_ready|open_start_pending|open_start_fail|\
        open_qr_worker_spawned|open_modal_command_returning|open_no_fbink|\
        control_config_invalid|receiver_start_enter|receiver_already_ready|receiver_reused_waiting|\
        receiver_spawn_begin|receiver_spawn_end|receiver_wait_begin|\
        receiver_ready|receiver_pending|receiver_fail|\
        qr_worker_begin|qr_guard_wait_begin|qr_guard_wait_end|\
        qr_status_wait_begin|qr_status_wait_end|qr_status_wait_timeout|\
        qr_flow_mismatch|qr_fbink_begin|qr_fbink_ok|qr_fbink_fail|qr_fail|\
        finish_feedback_begin|finish_feedback_ok|finish_feedback_fail|finish_feedback_timeout|\
        finish_prepare_begin|finish_stop_ok|finish_stop_fail|\
        finish_begin_restore_begin|finish_begin_restore_ok|finish_begin_restore_fail|\
        restore_probe_true_begin|restore_probe_true_yes|restore_probe_true_no|restore_probe_true_fail|\
        restore_probe_false_begin|restore_probe_false_yes|restore_probe_false_no|restore_probe_false_fail|\
        finish_finalize_begin|finish_finalize_ok|finish_finalize_fail|\
        stop_begin|stop_no_pid|stop_refused_pid|stop_refused_active|\
        stop_refused_root_part|stop_refused_upload_dir|stop_refused_staging_read|\
        stop_refused_staging_nonempty|stop_signal_sent|stop_signal_fail|\
        stop_admission_refused|stop_admission_closed|\
        stop_wait_begin|stop_wait_end|stop_still_running|stop_ok|\
        stop_flow_cancel_ok|stop_flow_cancel_fail)
            ;;
        *)
            return 0
            ;;
    esac

    kss_timing_uptime=""
    if ! IFS=' ' read -r kss_timing_uptime kss_timing_idle 2>/dev/null < /proc/uptime; then
        return 0
    fi
    case "$kss_timing_uptime" in
        ''|*[!0-9.]*|.*|*.*.*)
            return 0
            ;;
    esac

    if kss_flow_id_is_valid "${KSS_FLOW_ID:-}"; then
        printf 'v2 uptime_s=%s flow=%s stage=%s\n' \
            "$kss_timing_uptime" "$KSS_FLOW_ID" "$kss_timing_stage" \
            2>/dev/null >>"$KSS_ACTION_TIMING_LOG" || :
    else
        printf 'v1 uptime_s=%s stage=%s\n' "$kss_timing_uptime" "$kss_timing_stage" \
            2>/dev/null >>"$KSS_ACTION_TIMING_LOG" || :
    fi
    return 0
}
