#!/bin/bash

test -n "${OS_VERSION}" || source /etc/init.d/base
test -n "${OS_FACTORY_RESET_GPIO}" || test -n "${OS_FACTORY_RESET_INPUT}" || exit 0

OS_FACTORY_RESET_HOLD_SECONDS=${OS_FACTORY_RESET_HOLD_SECONDS:-10}
OS_FACTORY_RESET_LEVEL=${OS_FACTORY_RESET_LEVEL:-1}

INPUT_VALUE_FILE=/tmp/.reset_button_input


function reset_factory_defaults() {
    test -x /usr/libexec/before-factory-reset && /usr/libexec/before-factory-reset
    sync
    source /tmp/disk_info
    echo -e "d
        3
        w" | /sbin/fdisk ${DISK_DEV} &>/dev/null
    sync
    test -x /usr/libexec/after-factory-reset && /usr/libexec/after-factory-reset
    /sbin/reboot
}

function get_button_value() {
    if [[ -n "${OS_FACTORY_RESET_GPIO}" ]]; then
        gpio.sh ${OS_FACTORY_RESET_GPIO}
    elif [[ -s "${INPUT_VALUE_FILE}" ]]; then
        cat ${INPUT_VALUE_FILE}
    else
        expr ${OS_FACTORY_RESET_LEVEL} - 1
    fi
}

function read_input() {
    value=$(od -N 32 -v -t x2 /dev/input/${OS_FACTORY_RESET_INPUT} | grep -E "^0000000 " | cut -d ' ' -f 8)
    printf "%d" "${value:-0}"
}

function watch_input() {
    expr ${OS_FACTORY_RESET_LEVEL} - 1 > ${INPUT_VALUE_FILE}
    while true; do
        if value=$(read_input); then
            echo ${value} > ${INPUT_VALUE_FILE}
        else
            sleep 1
        fi
    done
}

function watch() {
    count=0
    while true; do
        sleep 1
        if [[ $(get_button_value) == ${OS_FACTORY_RESET_LEVEL} ]]; then
            count=$((count + 1))
            logger -t factory-reset "button pressed (count=${count})"
        else
            if [[ ${count} -gt 0 ]]; then
                logger -t factory-reset "button released"
            fi
            count=0
        fi
        if [[ ${count} -ge ${OS_FACTORY_RESET_HOLD_SECONDS} ]]; then
            logger -t factory-reset "resetting to factory defaults"
            reset_factory_defaults
            break
        fi
    done
}

function start() {
    msg_begin "Starting factory-reset listener"
    watch &
    test -n "${OS_FACTORY_RESET_INPUT}" && watch_input &
    msg_done
}

function stop() {
    msg_begin "Stopping factory-reset listener"
    ps | grep factoryreset | grep -v $$ | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1 | xargs -r kill
    msg_done
}

case "$1" in
    start)
        start
        ;;
        
    stop)
        stop
        ;;
        
    restart)
        stop
        start
        ;;
    
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0
