#!/bin/bash
set -euo pipefail

action=${1:?action}
interface=${2:?interface}
config=${3:?config}

case "$interface" in
  *[!a-zA-Z0-9_=+.-]*|'') echo 'invalid interface' >&2; exit 2 ;;
esac

case "$action" in
  up)
    test "$(awk -F= '/^[[:space:]]*Table[[:space:]]*=/{gsub(/[[:space:]]/, "", $2); print tolower($2); exit}' "$config")" = off
    test ! -e "/sys/class/net/$interface"
    /usr/bin/amneziawg-go-v2 "$interface"
    for _ in $(seq 1 50); do
      test -e "/sys/class/net/$interface" && break
      sleep 0.1
    done
    test -e "/sys/class/net/$interface"
    stripped=$(mktemp /run/awg-v2-strip.XXXXXX)
    trap 'rm -f "$stripped"' EXIT
    /usr/bin/awg-quick strip "$config" >"$stripped"
    /usr/bin/awg setconf "$interface" "$stripped"
    rm -f "$stripped"
    trap - EXIT
    while IFS= read -r address; do
      case "$address" in
        *:*) ip -6 address add "$address" dev "$interface" ;;
        *) ip -4 address add "$address" dev "$interface" ;;
      esac
    done < <(awk -F= '/^[[:space:]]*Address[[:space:]]*=/{gsub(/[[:space:]]/, "", $2); n=split($2,a,","); for(i=1;i<=n;i++) if(a[i] != "") print a[i]}' "$config")
    mtu=$(awk -F= '/^[[:space:]]*MTU[[:space:]]*=/{gsub(/[[:space:]]/, "", $2); print $2; exit}' "$config")
    ip link set mtu "${mtu:-1420}" up dev "$interface"
    ;;
  down)
    ip link delete dev "$interface" 2>/dev/null || true
    rm -f "/run/amneziawg/$interface.sock" "/var/run/amneziawg/$interface.sock"
    ;;
  *) echo 'invalid action' >&2; exit 2 ;;
esac
