#!/usr/bin/env bash
# VayDNS Server Quick Installer
# Usage: bash <(curl -fsSL https://vaydns.orx.ma/install_server.sh)

set -e
source /opt/vaydns/utils.sh 2>/dev/null || true

VAYDNS_DIR="/opt/vaydns"

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m'

info()  { echo -e "  ${GREEN}[+]${NC} $*"; }
warn()  { echo -e "  ${YELLOW}[!]${NC} $*"; }
error() { echo -e "  ${RED}[✗]${NC} $*"; exit 1; }

echo -e "${CYAN}${BOLD}"
echo "  VayDNS Server Setup"
echo "  ──────────────────"
echo -e "${NC}"

[[ $EUID -ne 0 ]] && error "Run as root"
[[ ! -f "$VAYDNS_DIR/vaydns-server" ]] && error "Run setup.sh first: bash <(curl -fsSL https://vaydns.orx.ma/setup.sh)"

echo -e "  ${BOLD}Configure your VayDNS Server${NC}\n"

read -rp "  Tunnel domain (e.g. t.example.com): " DOMAIN
[[ -z "$DOMAIN" ]] && error "Domain is required"

read -rp "  Listen port [5300]: " PORT
PORT="${PORT:-5300}"

read -rp "  Upstream address [127.0.0.1:8000]: " UPSTREAM
UPSTREAM="${UPSTREAM:-127.0.0.1:8000}"

read -rp "  Record type [txt]: " RECTYPE
RECTYPE="${RECTYPE:-txt}"

read -rp "  MTU [1232]: " MTU
MTU="${MTU:-1232}"

read -rp "  Log level [info]: " LOGLEVEL
LOGLEVEL="${LOGLEVEL:-info}"

PRIVKEY="$VAYDNS_DIR/keys/server.key"
if [[ ! -f "$PRIVKEY" ]]; then
  info "Generating keypair..."
  mkdir -p "$VAYDNS_DIR/keys"
  "$VAYDNS_DIR/vaydns-server" -gen-key \
    -privkey-file "$PRIVKEY" \
    -pubkey-file  "$VAYDNS_DIR/keys/server.pub"
  chmod 600 "$PRIVKEY"
fi

info "Writing configuration..."
mkdir -p "$VAYDNS_DIR"
cat > "$VAYDNS_DIR/vaydns.conf" <<EOF
[server]
domain = $DOMAIN
listen_port = $PORT
upstream = $UPSTREAM
privkey_file = $PRIVKEY
mtu = $MTU
record_type = $RECTYPE
idle_timeout = 10s
keepalive = 2s
log_level = $LOGLEVEL

[client]
domain =
listen = 127.0.0.1:7000
pubkey_file = $VAYDNS_DIR/keys/server.pub
transport = doh
doh_url = https://doh.cloudflare.com/dns-query
dot_addr =
udp_addr = 8.8.8.8:53
record_type = txt
idle_timeout = 10s
keepalive = 2s
log_level = info
utls = weighted

[proxy]
mode = none
proxy_type = socks5
EOF

info "Setting up iptables port redirect (53 → $PORT)..."
iptables  -I INPUT -p udp --dport "$PORT" -j ACCEPT 2>/dev/null || warn "iptables (IPv4) failed — apply manually"
iptables  -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports "$PORT" 2>/dev/null || true
ip6tables -I INPUT -p udp --dport "$PORT" -j ACCEPT 2>/dev/null || true
ip6tables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports "$PORT" 2>/dev/null || true

info "Creating systemd service..."
cat > /etc/systemd/system/vaydns-server.service <<EOF
[Unit]
Description=VayDNS Server
After=network.target

[Service]
ExecStart=$VAYDNS_DIR/vaydns-server -udp :$PORT -domain $DOMAIN -upstream $UPSTREAM -privkey-file $PRIVKEY -mtu $MTU -record-type $RECTYPE -idle-timeout 10s -keepalive 2s -log-level $LOGLEVEL
Restart=on-failure
RestartSec=5
StandardOutput=append:$VAYDNS_DIR/logs/server.log
StandardError=append:$VAYDNS_DIR/logs/server.log

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable vaydns-server
systemctl start vaydns-server

echo ""
echo -e "  ${GREEN}${BOLD}✔ VayDNS Server started!${NC}"
echo ""
echo -e "  ${BOLD}Public key (share with clients):${NC}"
echo -e "  ${CYAN}$(cat "$VAYDNS_DIR/keys/server.pub")${NC}"
echo ""
echo -e "  ${BOLD}DNS Zone records needed:${NC}"
echo -e "    A    tns.$(echo "$DOMAIN" | cut -d. -f2-)   YOUR_SERVER_IP"
echo -e "    NS   $DOMAIN   tns.$(echo "$DOMAIN" | cut -d. -f2-)"
echo ""
echo -e "  ${BOLD}Manage with:${NC} vaydns"
