#!/bin/bash
#
# Modemly One-Click Dial-Up macOS provisioning script.
# Creates PPP configuration files required for the virtual modem profile.

set -euo pipefail

header() {
  echo "==========================================="
  echo "   Modemly One-Click Dial-Up — macOS"
  echo "==========================================="
  echo
}

require_binary() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "Error: required tool '$1' not found in PATH." >&2
    exit 1
  fi
}

header
require_binary sudo
require_binary mktemp
require_binary bash

read -r -p "Modemly access number (e.g. 555-9876): " ACCESS_NUMBER
read -r -p "PPP username: " PPP_USERNAME
read -s -p "PPP password: " PPP_PASSWORD
echo
echo "Provisioning Modemly PPP profile..."

ACCESS_ESCAPED=$(printf '%q' "$ACCESS_NUMBER")
USER_ESCAPED=$(printf '%q' "$PPP_USERNAME")
PASS_ESCAPED=$(printf '%q' "$PPP_PASSWORD")

TMP_SCRIPT=$(mktemp /tmp/modemly-macos-provision.XXXXXX)
trap 'rm -f "$TMP_SCRIPT"' EXIT

cat >"$TMP_SCRIPT" <<EOS
#!/bin/bash
set -euo pipefail

ACCESS_NUMBER=$ACCESS_ESCAPED
PPP_USERNAME=$USER_ESCAPED
PPP_PASSWORD=$PASS_ESCAPED

PEER_PATH="/etc/ppp/peers/virtualdial"
CHAT_PATH="/etc/ppp/chat-virtualdial"
CHAP_SECRETS="/etc/ppp/chap-secrets"

if [[ ! -x /usr/sbin/pppd ]]; then
  echo "pppd is not available. Install the macOS command line tools or ensure pppd is present." >&2
  exit 1
fi

cat <<EOT >/etc/ppp/chat-virtualdial
ABORT BUSY
ABORT 'NO CARRIER'
ABORT ERROR
'' ATZ
OK ATDT\$ACCESS_NUMBER
CONNECT \\c
EOT
chmod 600 /etc/ppp/chat-virtualdial

mkdir -p /etc/ppp/peers
cat <<EOP >"\$PEER_PATH"
115200
crtscts
defaultroute
noauth
usepeerdns
user \$PPP_USERNAME
remotename modemly
connect "/usr/sbin/chat -v -f /etc/ppp/chat-virtualdial"
EOP
chmod 600 "\$PEER_PATH"

touch "\$CHAP_SECRETS"
grep -v 'modemly' "\$CHAP_SECRETS" >"\$CHAP_SECRETS.tmp" || true
mv "\$CHAP_SECRETS.tmp" "\$CHAP_SECRETS"
printf "%s\tmodemly\t%s\t*\n" "\$PPP_USERNAME" "\$PPP_PASSWORD" >>"\$CHAP_SECRETS"
chmod 600 "\$CHAP_SECRETS"

echo "Provisioning complete."
echo "Connect using: sudo pppd call virtualdial"
EOS

chmod +x "$TMP_SCRIPT"
if sudo "$TMP_SCRIPT"; then
  echo
  echo "All set! Use 'sudo pppd call virtualdial' to connect and 'sudo killall pppd' to disconnect."
else
  echo "Provisioning failed. Review the error details above." >&2
  exit 1
fi
