#!/bin/bash


reset_wireless()
{
	nmcli d dis wlan0 > /dev/null 2>&1
	uci set wireless.sta_0.disabled="1"
	uci set wireless.sta_0.ssid='Host-SSID'
    uci set wireless.sta_0.key='Host-Passphrase'

	nmcli c del $(nmcli -t -f uuid,type c | grep ":802-11-wireless$" | cut -d: -f1) > /dev/null 2>&1
	nmcli c reload > /dev/null 2>&1

	AP_SSID=$(hostname)
    AP_KEY="dragino+dragino"
	systemctl stop hostapd
	systemctl stop isc-dhcp-server
	uci set wireless.ap_0.disabled="0"
	uci set wireless.general.mode="ap"
	uci set wireless.ap_0.ssid="$AP_SSID"
	uci set wireless.ap_0.key="$AP_KEY"
	uci commit wireless
}

enable_ap()
{

	if [[ $(lsmod |grep rtl8188fu -c) -gt 0 ]]; then
		interface_type=wlan1
	else
		interface_type=wlan0
	fi
	cp /etc/hostapd/hostapd.conf.bak /etc/hostapd/hostapd.conf
	sed -i '1s/interface\=wlan0/interface\='$interface_type'/' /etc/hostapd/hostapd.conf
	echo "ssid=$AP_SSID" >> /etc/hostapd/hostapd.conf
	echo "wpa_passphrase=$AP_KEY" >> /etc/hostapd/hostapd.conf
	systemctl enable enable_ap 
	/usr/local/dragino/wireless/enable_ap > /dev/null 2>&1
}

reset_localstorage()
{
	# Reset local storage database and config
	rm -f /usr/local/dragino/local_storage/local_storage.db
	if [ -f /usr/local/share/localstorage.bak ]; then
		cp /usr/local/share/localstorage.bak /etc/config/localstorage
	fi
	systemctl stop dragino-local-storage 2>/dev/null
	systemctl disable dragino-local-storage 2>/dev/null
}

reset_mqtt_forwarder()
{
	# Stop and disable MQTT forwarder services
	systemctl stop mqttforwarder 2>/dev/null
	systemctl disable mqttforwarder 2>/dev/null
	systemctl stop mqttdownlinkforwarder 2>/dev/null
	systemctl disable mqttdownlinkforwarder 2>/dev/null

	# Remove persistent MQTT forwarder state (failed buffer, topic maps, overrides, certificates)
	rm -f /usr/local/dragino/forwarder/mqtt/failed_messages.db*
	rm -f /usr/local/failed_messages.txt
	rm -f /usr/local/dragino/forwarder/mqtt/device_topics.conf
	rm -f /usr/local/dragino/forwarder/mqtt/topic_map.json
	rm -f /usr/local/dragino/forwarder/mqtt/downlink_device_topics.conf
	rm -f /usr/local/dragino/forwarder/mqtt/downlink_topic_map.json
	rm -rf /usr/local/dragino/forwarder/mqtt/cert

	# Restore default forwarder config
	if [ -f /usr/local/share/forwarder.bak ]; then
		cp /usr/local/share/forwarder.bak /etc/config/forwarder
		uci commit forwarder 2>/dev/null
	else
		rm -f /etc/config/forwarder
	fi
}

reset_chirpstack()
{
	# Reset ChirpStack data using the dedicated reset script
	if [ -f /usr/local/dragino/chirpstack/reset.sh ]; then
		/usr/local/dragino/chirpstack/reset.sh reset_data
	fi
}

reset_wan()
{
	nmcli con del static-ip >/dev/null 2>&1
	nmcli connection delete eth0 >/dev/null 2>&1
}

reset()
{
	logger -i -t "Reset Gateway" "$(date) Resting to factory" && echo timer > /sys/class/leds/dragino\:blue\:opt/trigger
	rm  /etc/station/*
	if [[ -f /usr/local/share/conf_backup.tar.gz ]]; then
			tar xvpPfz /usr/local/share/conf_backup.tar.gz -C / > /dev/null 2>&1
	fi
	reset_wireless
	reset_wan
	reset_localstorage
	reset_mqtt_forwarder
	reset_chirpstack
	systemctl restart NetworkManager
	enable_ap
	touch /boot/armbian_first_run.txt && /usr/lib/armbian/armbian-firstrun-config && sleep 15
	/usr/local/dragino/generate-config.sh start
	timedatectl set-timezone Etc/UTC
	echo 'root:dragino' | chpasswd
    userdel -r admin > /dev/null 2>&1
	grep -E "^(admin|root)"  /etc/shadow | cut -d : -f 1,2 > /etc/lighttpd/htpasswd
	systemctl enable ssh && systemctl restart ssh 
	systemctl enable fallback && systemctl restart fallback
	systemctl stop draginostation && systemctl disable draginostation
	systemctl restart draginofwd && systemctl enable draginofwd
	systemctl restart draginoiotkeepalive && systemctl enable draginoiotkeepalive
	logger -i -t "Reset Gateway" "$(date) Rest done" && echo none > /sys/class/leds/dragino\:blue\:opt/trigger
	ldconfig && systemctl restart lighttpd
}

pressed()
{
	date +%s > /tmp/toggle_button.log
}



case "$1" in
	released | reset)
		logger -t "BUTTON TRIG"  "button 0 even: released"
		released_at=`date +%s`
		if [[ -f /tmp/toggle_button.log ]]; then
			pressed_at=`cat /tmp/toggle_button.log`
			pressed_for=`expr $released_at - $pressed_at`
		fi

		if [[ $1 = reset ]]; then
        		reset
		elif [[ ! -z $pressed_for ]]; then
			
			if [[ $pressed_for -gt 10 ]]; then
		        reset
			elif [[ $pressed_for -gt 3 && $pressed_for -le 6 ]]; then
		        logger -i -t "Reset Gateway" "$(date) Resting the network" && echo 1 > /sys/class/leds/dragino\:blue\:opt/brightness
        		reset_wireless
				reset_wan
		        sleep 2;
				systemctl restart NetworkManager
		        logger -i -t "Reset Gateway" "$(date) Resting network done" && echo 0 > /sys/class/leds/dragino\:blue\:opt/brightness
			fi
		fi
	;;
	pressed)
			pressed
	;;
	*)
	;;
esac
sync
