#!/bin/bash
#
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES.
# SPDX-License-Identifier: LicenseRef-NVIDIA-Proprietary
#
# mlxconfig tool wrapper — REAL hardware version
# Calls actual mlxconfig for GET (query) and SET operations.
# Sources shared value maps from tools/ dir.

source "$(dirname "$0")/_lib.sh"
trace "$@"

# Source shared value maps (relative to DMS root)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
source "$SCRIPT_DIR/_value_maps.sh" 2>/dev/null || source "$SCRIPT_DIR/../_value_maps.sh"

OP="$1"; shift
TARGET="$1"; shift
BDF=$(bdf_from_target "$TARGET")

if [[ "$OP" == "GET" || "$OP" == "GET-NEXT" ]]; then
    QUERY=$(mlxconfig_query "$BDF" "$@")
    PENDING_SUFFIX=""
    if [[ "$OP" == "GET-NEXT" ]]; then
        PENDING_SUFFIX="-pending"
    fi
    for PARAM in "$@"; do
        # -e output: Name Default Current NextBoot
        # GET: current running value = $(NF-1)
        # GET-NEXT: next-boot value = $NF
        if [[ "$OP" == "GET" ]]; then
            RAW=$(echo "$QUERY" | grep -E "^\*?\s*${PARAM}\s" | awk '{print $(NF-1)}')
        else
            RAW=$(echo "$QUERY" | grep -E "^\*?\s*${PARAM}\s" | awk '{print $NF}')
        fi
        if [[ -z "$RAW" ]]; then
            continue
        fi
        RAW="${RAW%%(*}"
        LEAF_NAME="${LEAF[$PARAM]:-$PARAM}"
        MAPPED="${REV[$PARAM:$RAW]:-$RAW}"
        echo "${LEAF_NAME}${PENDING_SUFFIX}=${MAPPED}"
        case "$PARAM" in
            NUM_OF_PLANES_P*) echo "planes${PENDING_SUFFIX}=${MAPPED}" ;;
            MODULE_LANES_M*_P*) echo "lanes${PENDING_SUFFIX}=${MAPPED}" ;;
            MODULE_SPLIT_M*_P*) echo "preset${PENDING_SUFFIX}=${MAPPED}" ;;
        esac
    done
elif [[ "$OP" == "SET" ]]; then
    SET_ARGS=()
    PARAMS=()
    VALUES=()
    RAW_VALUES=()
    for PAIR in "$@"; do
        PARAM="${PAIR%%=*}"
        VALUE="${PAIR#*=}"
        MAPPED="${FWD[$PARAM:$VALUE]:-$VALUE}"
        [[ -n "${DMS_BACKEND_TRACE:-}" ]] && \
            echo "mlxconfig-wrapper: SET input ${PARAM}=${VALUE} mapped=${MAPPED}" >&2
        trace "SET-MAP target=${TARGET} bdf=${BDF} param=${PARAM} value=${VALUE} mapped=${MAPPED}"
        SET_ARGS+=("${PARAM}=${MAPPED}")
        PARAMS+=("$PARAM")
        VALUES+=("$VALUE")
        RAW_VALUES+=("$MAPPED")
    done
    [[ -n "${DMS_BACKEND_TRACE:-}" ]] && \
        echo "mlxconfig-wrapper: exec ${MLXCONFIG_BIN:-mlxconfig} -d ${BDF} -y set ${SET_ARGS[*]}" >&2
    trace "SET-EXEC ${MLXCONFIG_BIN:-mlxconfig} -d ${BDF} -y set ${SET_ARGS[*]}"
    mlxconfig_set "$BDF" "${SET_ARGS[@]}"

    QUERY=$(mlxconfig_query "$BDF" "${PARAMS[@]}")
    if [[ -n "${DMS_BACKEND_TRACE:-}" ]]; then
        echo "mlxconfig-wrapper: readback query ${MLXCONFIG_BIN:-mlxconfig} -d ${BDF} -e q ${PARAMS[*]}" >&2
        echo "$QUERY" | sed 's/^/mlxconfig-wrapper: readback /' >&2
    fi
    trace "SET-READBACK-QUERY ${MLXCONFIG_BIN:-mlxconfig} -d ${BDF} -e q ${PARAMS[*]}"
    RC=0
    for i in "${!PARAMS[@]}"; do
        PARAM="${PARAMS[$i]}"
        VALUE="${VALUES[$i]}"
        RAW_EXPECTED="${RAW_VALUES[$i]}"
        LEAF_NAME="${LEAF[$PARAM]:-$PARAM}"
        RAW=$(echo "$QUERY" | grep -E "^\*?\s*${PARAM}\s" | awk '{print $NF}')
        RAW="${RAW%%(*}"
        if [[ -z "$RAW" ]]; then
            echo "Error: mlxconfig SET readback missing Next Boot for ${PARAM}" >&2
            RC=1
            continue
        fi
        EXPECTED_YANG="${REV[$PARAM:$RAW_EXPECTED]:-$VALUE}"
        ACTUAL="${REV[$PARAM:$RAW]:-$RAW}"
        [[ -n "${DMS_BACKEND_TRACE:-}" ]] && \
            echo "mlxconfig-wrapper: verify ${PARAM} requested=${VALUE} expected=${EXPECTED_YANG} raw_expected=${RAW_EXPECTED} next_boot=${ACTUAL} raw=${RAW}" >&2
        trace "SET-VERIFY param=${PARAM} requested=${VALUE} expected=${EXPECTED_YANG} raw_expected=${RAW_EXPECTED} next_boot=${ACTUAL} raw=${RAW}"
        if [[ "$ACTUAL" != "$EXPECTED_YANG" ]]; then
            echo "Error: mlxconfig SET readback mismatch for ${PARAM}: requested ${VALUE} (normalized ${EXPECTED_YANG}, raw ${RAW_EXPECTED}), next-boot ${ACTUAL} (raw ${RAW})" >&2
            RC=1
            continue
        fi
        echo "${LEAF_NAME}=${VALUE}"
    done
    exit $RC
fi
