#!/bin/bash

FAN_TABLE_FILE_IN="/usr/share/swampd/config.json.in"
TEMP_FILE="$(mktemp)"
cp "$FAN_TABLE_FILE_IN" "$TEMP_FILE"

# wait for fan dbus
mapper wait /xyz/openbmc_project/sensors/fan_tach/fan0
mapper wait /xyz/openbmc_project/sensors/fan_tach/fan1
mapper wait /xyz/openbmc_project/sensors/fan_tach/fb_fan0
mapper wait /xyz/openbmc_project/sensors/fan_tach/fb_fan1
mapper wait /xyz/openbmc_project/sensors/fan_tach/fb_fan2

# generate fan table writePath
Fan_0_To_4_Hwmon="$(ls /sys/devices/platform/ahb/ahb:*/*pwm-fan-controller/hwmon/)"

if [[ "$Fan_0_To_4_Hwmon" != "" ]]; then
    sed -i "s/@Fan_0_To_4_Hwmon@/$Fan_0_To_4_Hwmon/g" "$TEMP_FILE"
fi

presentGpio=()
presentState=()
gpioPath="/sys/class/gpio/gpio"
if [[ -f "/etc/nvme/nvme_config.json" ]]; then
    # shellcheck disable=SC2207
    presentGpio=($(grep NVMeDrivePresentPin /etc/nvme/nvme_config.json \
                   | awk '{print $2}' | cut -d "," -f 0))
fi

nvmePath="/xyz/openbmc_project/sensors/temperature/nvme"
# Get and Set WCTEMP
for ((i = 0; i < 16; i++)); do
    name="@WCTemp$(printf "%02d" $i)@"
    wcTemp=72000

    if [[ -d "${gpioPath}${presentGpio[i]}" ]] &&
       [[ "$(cat "${gpioPath}${presentGpio[i]}/value")" == "0" ]]; then
        presentState[i]="true"
    else
        presentState[i]="false"
    fi

    if [[ "${presentState[i]}" == "true" ]]; then
        actualWCTemp=0
        for ((j = 0; j < 3; j++)); do
            actualWCTemp="$(
                busctl get-property xyz.openbmc_project.nvme.manager \
                    ${nvmePath}${i} \
                    xyz.openbmc_project.Sensor.Threshold.Critical \
                    CriticalHigh | awk '{print $2}'
            )"
            if [[ "${actualWCTemp}" -ne 0 ]]; then
                break
            fi

            echo "${nvmePath}${i} WCTemp was read to be 0, retrying after 1 sec sleep"
            sleep 1
        done

        if [[ "${actualWCTemp}" -ne 0 ]]; then
            wcTemp="$(echo "${actualWCTemp} -7" | awk '{printf $1 + $2}')"
        else
            echo "${nvmePath}${i} WCTemp was read to be 0, using default WCTemp: ${wcTemp}"
        fi
    fi

    sed -i "s/$name/${wcTemp}/g" "$TEMP_FILE"

    if [[ "${presentState[i]}" == "false" ]]; then
        sensorPath="${nvmePath}${i}"
        pathLine=$(grep -nw "$sensorPath" "$TEMP_FILE" | awk -F ':' '{print $1}')
        sed -i "$TEMP_FILE" -re "$((pathLine - 3)),$((pathLine + 6))d"
        if [ $i -eq 15 ]; then
            sed -i "$((pathLine - 4))s/,//" "$TEMP_FILE"
        fi

        listLine=$(grep -n "\"name\": \"nvme${i}\"" "$TEMP_FILE" | awk -F ':' '{print $1}')
        sed -i "$TEMP_FILE" -re "$((listLine - 1)),$((listLine + 21))d"
        if [ $i -eq 15 ]; then
            sed -i "$((listLine - 2))s/,//" "$TEMP_FILE"
        fi
    fi
done

# Use shell parameter expansion to trim the ".in" suffix
mv "$TEMP_FILE" "${FAN_TABLE_FILE_IN%".in"}"

exit 0
