#!/system/bin/sh

PREFIX=/data/data/com.termux/files/usr
export PATH="$PREFIX/bin:/system/bin:$PATH"
export LD_LIBRARY_PATH="$PREFIX/lib:${LD_LIBRARY_PATH:-}"
CURL=$PREFIX/bin/curl

# Replace these values before deployment. Do not commit the filled file.
API_TOKEN=YOUR_CLOUDFLARE_API_TOKEN
ZONE_ID=YOUR_CLOUDFLARE_ZONE_ID
RECORD_NAME=phone.example.com
RECORD_TYPE=AAAA
TTL=60

BASE_DIR=/data/local/ipv6-ddns
LOG_FILE=$BASE_DIR/ipv6-ddns.log
API=https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records
NEW_IPV6=$1

mkdir -p "$BASE_DIR"

log() {
  echo "[$(date '+%F %T')] $*" >> "$LOG_FILE"
}

if [ -z "$NEW_IPV6" ]; then
  log "no IPv6 argument"
  exit 1
fi

case "$API_TOKEN:$ZONE_ID:$RECORD_NAME" in
  *YOUR_*)
    log "Cloudflare configuration still contains placeholders"
    exit 1
    ;;
esac

RESP=$("$CURL" -sS --connect-timeout 10 --max-time 30 \
  -H "Authorization: Bearer $API_TOKEN" \
  "$API?type=$RECORD_TYPE&name=$RECORD_NAME") || {
  log "record query failed"
  exit 1
}

echo "$RESP" | grep -q '"success":true' || {
  log "Cloudflare query returned failure"
  exit 1
}

RECORD_ID=$(printf '%s' "$RESP" | sed -n 's/.*"id":"\([0-9a-f]\{32\}\)".*/\1/p' | head -n 1)
REMOTE_IPV6=$(printf '%s' "$RESP" | sed -n 's/.*"content":"\([0-9a-fA-F:]*\)".*/\1/p' | head -n 1)

if [ "$REMOTE_IPV6" = "$NEW_IPV6" ]; then
  log "IPv6 unchanged"
  exit 0
fi

if [ -z "$RECORD_ID" ]; then
  METHOD=POST
  URL=$API
else
  METHOD=PUT
  URL=$API/$RECORD_ID
fi

HTTP_CODE=$("$CURL" -sS --connect-timeout 10 --max-time 30 \
  -o /dev/null -w '%{http_code}' \
  -X "$METHOD" "$URL" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Content-Type: application/json' \
  --data "{\"type\":\"$RECORD_TYPE\",\"name\":\"$RECORD_NAME\",\"content\":\"$NEW_IPV6\",\"ttl\":$TTL,\"proxied\":false}")

case "$HTTP_CODE" in
  200|201)
    log "Cloudflare update succeeded (HTTP $HTTP_CODE)"
    exit 0
    ;;
  *)
    log "Cloudflare update failed (HTTP $HTTP_CODE)"
    exit 1
    ;;
esac
