#!/bin/bash

# NEXX Agent Installation Script
# Установка: curl -sSL https://nexios.ru/nexx/install.sh | bash

set -e

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

NEXIOS_URL="https://nexios.ru"
INSTALL_DIR="/opt/nexx-agent"
SERVER_ID="vps-$(hostname)-$(date +%s | tail -c 5)"

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
    exit 1
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

if [ "$EUID" -ne 0 ]; then 
    log_error "Запустите скрипт от root"
fi

log_info "Установка NEXX Agent..."

OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)

case $ARCH in
    x86_64) ARCH="amd64" ;;
    aarch64|arm64) ARCH="arm64" ;;
    *) log_error "Неподдерживаемая архитектура: $ARCH" ;;
esac

log_info "Система: $OS/$ARCH"

if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
    log_error "curl или wget не найдены. Установите вручную: apt-get install curl"
fi

log_info "Создаем директории..."
mkdir -p $INSTALL_DIR/data
mkdir -p $INSTALL_DIR/configs
mkdir -p /etc/sing-box
mkdir -p /var/log

log_info "Скачиваем NEXX Agent..."
if command -v curl &> /dev/null; then
    curl -sL -o $INSTALL_DIR/nexx-agent "$NEXIOS_URL/nexx/nexx-agent" || log_error "Не удалось скачать агент"
else
    wget -q -O $INSTALL_DIR/nexx-agent "$NEXIOS_URL/nexx/nexx-agent" || log_error "Не удалось скачать агент"
fi
chmod +x $INSTALL_DIR/nexx-agent

log_info "Скачиваем скрипт автообновления..."
if command -v curl &> /dev/null; then
    curl -sL -o $INSTALL_DIR/auto-update.sh "$NEXIOS_URL/nexx/auto-update.sh"
else
    wget -q -O $INSTALL_DIR/auto-update.sh "$NEXIOS_URL/nexx/auto-update.sh"
fi
chmod +x $INSTALL_DIR/auto-update.sh

log_info "Проверяем sing-box..."
SINGBOX_CHECK=$(curl -sI "$NEXIOS_URL/nexx/sing-box" 2>/dev/null | grep -c "200 OK" || echo "0")
if [ "$SINGBOX_CHECK" = "1" ]; then
    log_info "Скачиваем sing-box..."
    if command -v curl &> /dev/null; then
        curl -sL -o /usr/bin/sing-box "$NEXIOS_URL/nexx/sing-box"
    else
        wget -q -O /usr/bin/sing-box "$NEXIOS_URL/nexx/sing-box"
    fi
    chmod +x /usr/bin/sing-box
    log_info "sing-box установлен"
fi

log_info "Определяем IP..."
VPS_IP=$(curl -s https://api.ipify.org 2>/dev/null || wget -qO- https://api.ipify.org 2>/dev/null || echo "127.0.0.1")
log_info "IP: $VPS_IP"

log_info "Создаем конфигурацию..."
cat > $INSTALL_DIR/config.yaml <<EOF
server:
  port: "8080"
  whitelist_ips:
    - "127.0.0.1"
    - "$VPS_IP"
    - "95.165.98.239"

singbox:
  config_path: "/etc/sing-box/config.json"
  binary_path: "/usr/bin/sing-box"
  server_ip: "$VPS_IP"
  server_port: 443

nexios:
  url: "$NEXIOS_URL"
  server_id: "$SERVER_ID"

database:
  path: "$INSTALL_DIR/data/nexx.db"

logging:
  level: "info"
  file: "/var/log/nexx-agent.log"
EOF

cat > /etc/sing-box/config.json <<EOF
{
  "log": {
    "level": "info",
    "output": "/var/log/sing-box.log"
  },
  "inbounds": [],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    }
  ]
}
EOF

log_info "Создаем systemd службы..."
cat > /etc/systemd/system/nexx-agent.service <<EOF
[Unit]
Description=NEXX Agent
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=$INSTALL_DIR
ExecStart=$INSTALL_DIR/nexx-agent
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

if [ -f /usr/bin/sing-box ]; then
    cat > /etc/systemd/system/sing-box.service <<EOF
[Unit]
Description=sing-box
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/sing-box run -c /etc/sing-box/config.json
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure
RestartSec=10
LimitNOFILE=infinity
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF
fi

log_info "Настраиваем автообновление..."
CRON_LINE="0 * * * * /opt/nexx-agent/auto-update.sh >> /var/log/nexx-agent-update.log 2>&1"
{ crontab -l 2>/dev/null | grep -v "auto-update.sh" || true; echo "$CRON_LINE"; } | crontab -

# Создаем скрипт обновления blacklist
log_info "Настраиваем blacklist систему..."
cat > /opt/nexx-agent/update-blacklist.sh << 'SCRIPT_END'
#!/bin/bash
BLACKLIST_URL="https://nexios.ru/black.lst"
LOCAL_FILE="/opt/nexx-agent/black.lst"
BACKUP_FILE="/opt/nexx-agent/black.lst.backup"
TEMP_FILE="/tmp/black.lst.tmp"

# Скачать файл
if ! curl -sf "$BLACKLIST_URL" -o "$TEMP_FILE"; then
    [ -f "$BACKUP_FILE" ] && cp "$BACKUP_FILE" "$LOCAL_FILE"
    exit 0
fi

# Посчитать хеши
REMOTE_HASH=$(md5sum "$TEMP_FILE" | awk '{print $1}')
LOCAL_HASH=$([ -f "$LOCAL_FILE" ] && md5sum "$LOCAL_FILE" | awk '{print $1}')

# Файл не изменился
[ "$REMOTE_HASH" = "$LOCAL_HASH" ] && exit 0

# Валидация
if ! grep -vE '^(#|$)' "$TEMP_FILE" | grep -qE '^[a-zA-Z0-9.-]+$'; then
    echo "ERROR: Invalid domains format"
    exit 1
fi

# Применить
mv "$TEMP_FILE" "$LOCAL_FILE"
cp "$LOCAL_FILE" "$BACKUP_FILE"

# Триггер обновления sing-box
curl -sf http://localhost:8080/api/sync/trigger
echo "Blacklist updated"
SCRIPT_END

chmod +x /opt/nexx-agent/update-blacklist.sh

# Добавляем в crontab
BLACKLIST_CRON="*/15 * * * * /opt/nexx-agent/update-blacklist.sh >> /var/log/blacklist-update.log 2>&1"
{ crontab -l 2>/dev/null | grep -v "update-blacklist.sh" || true; echo "$BLACKLIST_CRON"; } | crontab -

# Первый запуск
log_info "Загружаем blacklist..."
/opt/nexx-agent/update-blacklist.sh

systemctl daemon-reload

log_info "Запускаем службы..."
systemctl enable nexx-agent 2>/dev/null
systemctl start nexx-agent || log_error "Не удалось запустить агент"

if [ -f /usr/bin/sing-box ]; then
    systemctl enable sing-box 2>/dev/null
    systemctl start sing-box
fi

sleep 2
if systemctl is-active --quiet nexx-agent; then
    log_info "Агент запущен"
else
    log_error "Агент не запустился. Логи: journalctl -u nexx-agent -n 50"
fi

log_info "Ждем создания базы данных..."
sleep 3

if [ -f "$INSTALL_DIR/data/nexx.db" ]; then
    log_info "Включаем WAL режим SQLite..."
    if command -v sqlite3 &> /dev/null; then
        sqlite3 "$INSTALL_DIR/data/nexx.db" "PRAGMA journal_mode=WAL;" >/dev/null 2>&1
        log_info "WAL режим включен"
    else
        log_warn "sqlite3 не установлен. Установите вручную: apt install sqlite3"
        log_warn "Затем выполните: sqlite3 $INSTALL_DIR/data/nexx.db \"PRAGMA journal_mode=WAL;\""
    fi
else
    log_warn "База данных еще не создана. WAL режим будет включен при следующем запуске"
fi

# Проверка состояния IPv6
echo ""
echo "========================================="
echo -e "${YELLOW}📡 Проверка сетевой конфигурации...${NC}"
echo "========================================="

IPV6_STATUS=$(ip -6 addr show scope global 2>/dev/null | wc -l)
if [ "$IPV6_STATUS" -gt 0 ]; then
    echo -e "${GREEN}✓ IPv6 адрес обнаружен${NC}"
    
    if ping6 -c 1 -W 2 google.com >/dev/null 2>&1; then
        echo -e "${GREEN}✓ IPv6 подключение работает${NC}"
        echo "Агент будет использовать prefer_ipv6 стратегию"
    else
        echo -e "${YELLOW}⚠ IPv6 адрес есть, но подключение не работает${NC}"
        echo "Агент будет использовать ipv4_only стратегию"
    fi
else
    echo -e "${YELLOW}⚠ IPv6 не настроен на сервере${NC}"
    echo "Агент будет использовать ipv4_only стратегию"
fi

# Тестируем оптимальный SNI
echo ""
echo "========================================="
echo -e "${YELLOW}📡 Тестирование оптимального SNI...${NC}"
echo "========================================="
wget -q https://nexios.ru/nexx/sni-test.sh -O $INSTALL_DIR/sni-test.sh
if [ $? -eq 0 ]; then
    chmod +x $INSTALL_DIR/sni-test.sh
    $INSTALL_DIR/sni-test.sh
else
    log_warn "SNI тестер не найден, пропускаем"
fi

echo ""
echo "========================================="
echo -e "${GREEN}Установка завершена!${NC}"
echo "========================================="
echo ""
echo "Server ID: $SERVER_ID"
echo "IP: $VPS_IP"
echo ""
echo "Команды:"
echo "  systemctl status nexx-agent"
echo "  journalctl -u nexx-agent -f"
echo "  $INSTALL_DIR/auto-update.sh"
echo "  $INSTALL_DIR/sni-test.sh    # Тест оптимального SNI"
echo ""
echo -e "${GREEN}Автообновление: каждый час${NC}"
echo "========================================"