# shellcheck shell=dash disable=SC3028

___x_cmd log init hostname

___x_cmd_hostname___main(){
    [ "$#" -gt 0 ] || set -- get

    case "$1" in
        -h|--help)              ___x_cmd help -m hostname "$@" ; return 0 ;;
        --long|--short|-l|-s)   ___x_cmd_hostname_get "$@" ;;
        get|get_)               shift; ___x_cmd_hostname_get "$@" ;;
        set)                    shift; ___x_cmd_hostname_set "$@" ;;
        *)                      N=hostname M="Unknown subcmd -> $1" log:ret:64 ;;
    esac
}

# Internal version: uses x_ variable
___x_cmd_hostname_get_(){
    local format="long"

    # Parse options
    while [ $# -gt 0 ]; do
        case "$1" in
            --long|-l)      format="long"; shift ;;
            --short|-s)     format="short"; shift ;;
            *)              break ;;
        esac
    done

    x_=""
    case "$format" in
        long)   ___x_cmd_hostname_long_ ;;
        short)  ___x_cmd_hostname_short_ ;;
    esac
}

# Public version: calls internal and prints result
___x_cmd_hostname_get(){
    local x_
    ___x_cmd_hostname_get_ "$@" || return $?
    printf "%s\n" "$x_"
}

___x_cmd_hostname_set(){
    if [ $# -eq 0 ]; then
        hostname:error "Please provide a hostname to set"
        return 1
    fi

    local new_hostname="$1"
    if ___x_cmd os is darwin; then
        hostname:info "Setting hostname requires sudo on macOS"
        ___x_cmd sudo scutil --set HostName "$new_hostname" || return $?
    else
        hostname:info "Setting hostname requires sudo on Linux"
        ___x_cmd sudo hostname "$new_hostname" || return $?
    fi
    hostname:info "Hostname set to: $new_hostname"
}

___x_cmd_hostname_long_(){
    x_="${HOSTNAME:-"${HOST}"}"
    [ -n "$x_" ] || x_="$(uname -n)"
}

___x_cmd_hostname_short_(){
    x_="${HOSTNAME:-"${HOST}"}"
    [ -n "$x_" ] || x_="$(uname -n)"
    x_="${x_%.*}"
}
