#!/bin/sh

export PATH="/usr/sbin:/usr/bin:/sbin:/bin:${PATH}"

SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
. "$SCRIPT_DIR/lib/airwifi-auth.sh"
. "$SCRIPT_DIR/lib/airwifi-net.sh"
require_auth

json_escape() {
  printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
}

# Prefer GUA (public) IPv6 over ULA (fd/fc)
read_ipv6_global() {
  _if="$1"
  _gua=""
  _ula=""
  _addrs="$(ip -6 addr show "$_if" 2>/dev/null | awk '/inet6 / && /scope global/ {print $2}' | cut -d/ -f1)"
  for _a in $_addrs; do
    case "$_a" in
      fe80:*|"") continue ;;
      fd*|fc*) [ -z "$_ula" ] && _ula="$_a" ;;
      *) _gua="$_a"; break ;;
    esac
  done
  if [ -n "$_gua" ]; then
    printf '%s' "$_gua"
  else
    printf '%s' "$_ula"
  fi
}

WAN_IF="$(read_wan_ifname)"

WAN_IP="$(ip -4 addr show "$WAN_IF" 2>/dev/null | awk '/inet /{print $2}' | cut -d/ -f1 | head -n1)"
WAN_GW="$(ip route 2>/dev/null | awk '/default/{print $3; exit}')"
WAN_PROTO="$(uci -q get network.wan.proto)"
[ -z "$WAN_PROTO" ] && WAN_PROTO="dhcp"

WAN_IP6="$(read_ipv6_global "$WAN_IF")"
WAN_GW6="$(ip -6 route show default 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i=="via"){print $(i+1); exit}}')"

LAN_IF="br-lan"
if [ "$(uci -q get network.lan.type)" != "bridge" ]; then
  _d="$(uci -q get network.lan.device)"
  [ -z "$_d" ] && _d="$(uci -q get network.lan.ifname)"
  case "$_d" in
    ""|*" "*) ;;
    *) LAN_IF="$_d" ;;
  esac
fi

LAN_IP="$(uci -q get network.lan.ipaddr)"
LAN_MASK="$(uci -q get network.lan.netmask)"
[ -z "$LAN_IP" ] && LAN_IP="192.168.1.1"
[ -z "$LAN_MASK" ] && LAN_MASK="255.255.255.0"
LAN_IP6="$(read_ipv6_global "$LAN_IF")"

[ -n "$WAN_IP" ] || [ -n "$WAN_IP6" ] && CONNECTED=true || CONNECTED=false

DNS_RAW="$(read_wan_dns_raw)"
DNS_JSON="$(build_dns_json_array "$DNS_RAW")"

echo "Content-Type: application/json"
echo "Cache-Control: no-store"
echo
printf '{"ok":true,"wan":{"connected":%s,"ip":"%s","ipv6":"%s","gateway":"%s","gateway6":"%s","proto":"%s","dns":%s},"lan":{"ip":"%s","ipv6":"%s","netmask":"%s"}}\n' \
  "$CONNECTED" \
  "$(json_escape "${WAN_IP:-}")" \
  "$(json_escape "${WAN_IP6:-}")" \
  "$(json_escape "${WAN_GW:-}")" \
  "$(json_escape "${WAN_GW6:-}")" \
  "$(json_escape "$WAN_PROTO")" \
  "$DNS_JSON" \
  "$(json_escape "$LAN_IP")" \
  "$(json_escape "${LAN_IP6:-}")" \
  "$(json_escape "$LAN_MASK")"
