#!/bin/bash

export GUM_INPUT_CURSOR_FOREGROUND="#0FF"
export GUM_INPUT_PROMPT_FOREGROUND="#0FF"
export GUM_INPUT_PLACEHOLDER="Enter data"
export GUM_INPUT_PROMPT=">> "
export GUM_INPUT_WIDTH=80

set -e

VERSION="1.4.0"
REMNAWAVE_VERSION=$(curl -s https://api.github.com/repos/remnawave/panel/releases/latest | jq -r '.tag_name')

install_gum() {
    if ! command -v gum &>/dev/null; then
        echo "Installing gum... Please wait..."
        if [ "$(uname -s)" = "Darwin" ]; then
            brew install gum
        else
            sudo mkdir -p /etc/apt/keyrings
            curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
            echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
            sudo apt update && sudo apt install gum && sudo apt install jq
        fi
    fi
}

check_if_running_as_root() {
    if [ "$EUID" -ne '0' ]; then
        echo "error: You must run this script as root!"
        exit 1
    fi
}

generate_secret() {
    local length=$1
    local charset="hex"
    [ "$2" = "hex" ] && charset="hex"
    openssl rand -$charset $length | head -c $length
}

# Проверка Docker
check_docker() {
    if command -v docker >/dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}

check_gum() {
    if command -v gum >/dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}

show_finish() {
    gum style --foreground 212 "📝 Configuration saved. You can edit it later in the .env file."

    gum style --foreground 212 "🎉 Start Remnawave: cd remnawave && docker compose up -d && docker compose logs -f -t"
    gum style --foreground 200 ""
    gum style --foreground 200 ""
    gum style --foreground 200 ""
    gum style --foreground 212 "🚫 Installation not completed yet. Please, follow guide for installation of reverse proxy."
    gum style --foreground "111" "→ https://get.remna.st/rp"
}

setup_remnawave() {
    gum style \
        --foreground 212 --border double --align center --width 50 --margin "1 2" --padding "2 4" \
        "🌎 https://remna.st" "🌊 Remnawave v${REMNAWAVE_VERSION}" "🧰 Installer Version: ${VERSION}" "📱 https://t.me/remnawave"

    # Создаем директорию
    gum spin --spinner dot --title "Creating directory..." -- mkdir -p remnawave
    cd remnawave || exit 1

    # Базовые настройки
    gum style --foreground 99 "📊 Database settings"
    gum style --foreground "241" "Enter database connection data"
    POSTGRES_USER=$(gum input --placeholder "Username (default: postgres)")
    POSTGRES_PASSWORD=$(gum input --placeholder "Password (default: postgres)" --password)
    POSTGRES_DB=$(gum input --placeholder "Database name (default: postgres)")

    POSTGRES_USER=${POSTGRES_USER:-postgres}
    POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
    POSTGRES_DB=${POSTGRES_DB:-postgres}

    JWT_AUTH_SECRET=$(generate_secret 64)
    JWT_API_SECRET=$(generate_secret 64)
    METRICS_PASSWORD=$(generate_secret 16)
    WEBHOOK_SECRET=$(generate_secret 64)

    gum style --foreground 99 "🤖 Telegram settings"
    IS_TELEGRAM_ENABLED=$(gum confirm "Enable Telegram integration?" && echo "true" || echo "false")
    if [ "$IS_TELEGRAM_ENABLED" = "true" ]; then
        gum style --foreground 99 "🤖 Telegram settings"
        TELEGRAM_BOT_TOKEN=$(gum input --placeholder "Bot token")
        TELEGRAM_ADMIN_ID=$(gum input --placeholder "Admin ID")
        TELEGRAM_NOTIFY_CHAT=$(gum input --placeholder "Chat ID for notifications")
    fi

    WEBHOOK_ENABLED=$(gum confirm "Enable webhook?" && echo "true" || echo "false")
    if [ "$WEBHOOK_ENABLED" = "true" ]; then
        gum style --foreground 99 "🔗 Webhook settings"
        WEBHOOK_URL=$(gum input --placeholder "URL webhook (https://...)")
    fi

    # gum style --foreground 99 "🔗 Domain settings"
    # gum style --foreground "241" "Enter domain for panel access."
    # FRONT_END_DOMAIN=$(gum input --placeholder "Frontend domain (default: *)")

    SUB_PUBLIC_DOMAIN=${SUB_PUBLIC_DOMAIN:-"changge-me.com/api/sub"}
    FRONT_END_DOMAIN=${FRONT_END_DOMAIN:-"*"}

    gum style --foreground 99 "Admin access. Password will be generated automatically."
    SUPERADMIN_USERNAME=$(gum input --placeholder "Username (default: admin)")

    gum spin --spinner dot --title "Creating..." -- sleep 5
    gum spin --spinner dot --title "Downloading docker-compose.yml..." -- \
        curl -sSL "https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml" \
        -o docker-compose.yml || error "Failed to download docker-compose.yml"

    gum spin --spinner dot --title "Creating .env file..." -- cat >.env <<EOL
### APP ###
APP_PORT=3000
METRICS_PORT=3001

APP_INSTANCES=1

### DATABASE ###
DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@remnawave-db:5432/${POSTGRES_DB}"

### JWT ###
JWT_AUTH_SECRET=${JWT_AUTH_SECRET}
JWT_API_TOKENS_SECRET=${JWT_API_SECRET}

### TELEGRAM ###
IS_TELEGRAM_ENABLED=${IS_TELEGRAM_ENABLED}
TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-change_me}
TELEGRAM_ADMIN_ID=${TELEGRAM_ADMIN_ID:-change_me}
NODES_NOTIFY_CHAT_ID=${TELEGRAM_NOTIFY_CHAT:-change_me}

### FRONT_END ###
FRONT_END_DOMAIN=${FRONT_END_DOMAIN}

### SUBSCRIPTION PUBLIC DOMAIN ###
SUB_PUBLIC_DOMAIN=${SUB_PUBLIC_DOMAIN}

### SWAGGER ###
SWAGGER_PATH=/docs
SCALAR_PATH=/scalar
IS_DOCS_ENABLED=true

### REDIS ###
REDIS_HOST=remnawave-redis
REDIS_PORT=6379

### PROMETHEUS ###
METRICS_USER=admin
METRICS_PASS=${METRICS_PASSWORD}

### WEBHOOK ###
WEBHOOK_ENABLED=${WEBHOOK_ENABLED}
WEBHOOK_URL=${WEBHOOK_URL:-https://webhook.site/1234567890}
WEBHOOK_SECRET_HEADER=${WEBHOOK_SECRET}

### Database ###
POSTGRES_USER=${POSTGRES_USER}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
POSTGRES_DB=${POSTGRES_DB}
EOL

}

check_if_running_as_root

if ! check_gum; then
    echo "Gum is not installed. Installing..."
    install_gum
fi

if ! check_docker; then
    gum style --foreground 99 "🐳 Docker is not installed. Please install Docker before moving on."
    if gum confirm "Install Docker automatically?"; then
        gum spin --spinner dot --title "Installing Docker..." -- sh -c 'curl -fsSL https://get.docker.com | sh'
        gum style --foreground 212 "✅ Docker successfully installed"
    else
        gum style --foreground 196 "❌ You must install Docker to continue"
        exit 1
    fi
fi
setup_remnawave
show_finish
