#!/bin/sh
set -eu

RIG_NAME_FILE="${PINS_RIG_NAME_FILE:-/etc/pins/rig-name}"

normalize_name() {
    printf '%s' "$1" \
        | tr '[:upper:]' '[:lower:]' \
        | sed -e 's/[^a-z0-9.-][^a-z0-9.-]*/-/g' -e 's/^-*//' -e 's/-*$//' \
        | cut -c1-63
}

is_valid_name() {
    case "$1" in
        ""|.*|*-|*..*|*[^a-z0-9.-]*) return 1 ;;
        *) return 0 ;;
    esac
}

configured_name="$(normalize_name "${PINS_RIG_ID:-}")"
if is_valid_name "$configured_name"; then
    rig_name="$configured_name"
elif [ -r "$RIG_NAME_FILE" ]; then
    saved_name="$(normalize_name "$(head -n1 "$RIG_NAME_FILE")")"
    if is_valid_name "$saved_name"; then
        rig_name="$saved_name"
    fi
fi

if [ -z "${rig_name:-}" ]; then
    suffix=""
    if [ -r /proc/cpuinfo ]; then
        serial="$(sed -n 's/^Serial[[:space:]]*:[[:space:]]*//p' /proc/cpuinfo | tail -n1)"
        serial="$(printf '%s' "$serial" | tr -cd '0-9A-Fa-f')"
        if [ -n "$serial" ]; then
            suffix="$(printf '%s' "$serial" | sed 's/.*\(.....\)$/\1/')"
        fi
    fi

    if [ -z "$suffix" ] && [ -r /etc/machine-id ]; then
        machine_id="$(tr -cd '0-9A-Fa-f' < /etc/machine-id)"
        if [ -n "$machine_id" ]; then
            suffix="$(printf '%s' "$machine_id" | sed 's/.*\(.....\)$/\1/')"
        fi
    fi

    if [ -z "$suffix" ]; then
        suffix="$(hostname 2>/dev/null | tr -cd 'A-Za-z0-9' | sed 's/.*\(.....\)$/\1/')"
    fi
    [ -n "$suffix" ] || suffix="00000"
    rig_name="pins-$(printf '%s' "$suffix" | tr '[:upper:]' '[:lower:]')"
fi

if [ "${1:-}" = "--ensure" ]; then
    rig_name_dir="$(dirname "$RIG_NAME_FILE")"
    mkdir -p "$rig_name_dir"
    temp_file="$(mktemp "$rig_name_dir/.rig-name.XXXXXX")"
    trap 'rm -f "$temp_file"' EXIT HUP INT TERM
    printf '%s\n' "$rig_name" > "$temp_file"
    chown root:root "$temp_file"
    chmod 644 "$temp_file"
    mv -f "$temp_file" "$RIG_NAME_FILE"
    trap - EXIT HUP INT TERM
fi

printf '%s\n' "$rig_name"
