#!/bin/bash
#change time using hwclock and date -s

clear

echo "The system time is: $(date "+%Y-%m-%d %H:%M:%S %Z")"
echo
echo "Please enter the current date and time in UTC"
echo "To find the current date and time in UTC, please check https://time.is/UTC"
echo

get_date () {
    local field_name min max
    field_name="$1"
    min="$2"
    max="$3"
    echo -n "Enter the current $field_name [$min-$max]: "
    read -r value
    echo

    #must be a number between $2 and $3
    while [[ ! $value =~ ^[0-9]+$ ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]];
    do
        echo "Please try again, it must be a number from $min to $max."
        echo -n "Enter the current $field_name [$min-$max]: "
        read -r value
        echo
    done

    # Pad with zeroes to length of maximum value.
    # The "$((10#$value))" is needed to handle 08 and 09 correctly, which printf
    # would otherwise interpret as octal.  This effectively strips the leading
    # zero by evaluating an arithmetic expression with the base set to 10.
    value="$(printf "%0${#max}u" "$((10#$value))")"
}

enter_time_and_change()
{
    get_date "year" "2024" "2200"
    year=$value
    get_date "month" "01" "12"
    month=$value
    get_date "day" "01" "31"
    day=$value
    get_date "hour" "00" "23"
    hour=$value
    get_date "minute" "00" "59"
    min=$value
    get_date "second" "00" "59"
    sec=$value

    if ! date -s "$year-$month-$day $hour:$min:$sec" &>/dev/null; then
        return 1
    fi
    return 0
}

while ! enter_time_and_change; do
    echo "Could not set the date to $year-$month-$day $hour:$min:$sec"
    read -rp "Try again? [Y/n]: " try_again_confirm
    if [ "${try_again_confirm^^}" = N ]; then
            exit 1
    fi
    echo
done

hwclock -w
echo "The system date has been sucessfully set to $year-$month-$day $hour:$min:$sec UTC"
echo

echo "Press Enter to return to the menu"
echo
read -r nothing