#!/bin/bash 

# Обработка ошибок
set -e

# Переменные
TARGET_DIR="/root/web"  # Папка, где уже клонирован репозиторий
DEFAULT_PORT=1234  # Порт по умолчанию
ENV_FILE="$TARGET_DIR/src/.env" # Переменные окружения

# Получение текущего порта из файла сервиса, если он уже установлен
SERVICE_FILE="/etc/systemd/system/StatusOpenVPN.service"
if [ -f "$SERVICE_FILE" ]; then
    CURRENT_PORT=$(grep -oP '(?<=-b 0.0.0.0:)[0-9]+' "$SERVICE_FILE" || echo "$DEFAULT_PORT")
else
    CURRENT_PORT=$DEFAULT_PORT
fi

# Функция для проверки, свободен ли порт
check_port_free() {
    local PORT=$1
    if ! ss -tuln | grep -q ":$PORT "; then
        return 0  # Порт свободен
    else
        return 1  # Порт занят
    fi
}

# Запрос на изменение текущего порта
read -e -p "Would you like to change the current port $CURRENT_PORT? (Y/N): " -i N CHANGE_PORT

if [[ "$CHANGE_PORT" =~ ^[Yy]$ ]]; then
    # Остановка сервиса
    echo "Stopping StatusOpenVPN service..."
    sudo systemctl stop StatusOpenVPN
    while true; do
        read -p "Please enter a new port number: " NEW_PORT

        if [[ "$NEW_PORT" =~ ^[0-9]+$ ]] && [ "$NEW_PORT" -ge 1 ] && [ "$NEW_PORT" -le 65535 ]; then
            if check_port_free "$NEW_PORT"; then
                PORT=$NEW_PORT
                echo "Port $PORT is free and will be used."
                break
            else
                echo "Port $NEW_PORT is already in use. Please try another one."
            fi
        else
            echo "Invalid port number. Please enter a number between 1 and 65535."
        fi
    done
else
    PORT=$CURRENT_PORT
    echo "Using current port $PORT."
fi

# Обновление репозитория
echo "Updating repository in $TARGET_DIR..."
cd $TARGET_DIR
git reset --hard  # Отмена всех локальных изменений
git fetch origin && git reset --hard origin/main

# rm src/openvpn_logs.db

#Активация виртуального окружения
echo "Activating virtual environment..."
source venv/bin/activate

# Проверка и установка новых зависимостей
if [ -f "requirements.txt" ]; then
    echo "Installing any new requirements from requirements.txt..."
    pip install -r requirements.txt
else
    echo "requirements.txt not found, skipping this step."
fi

# Обновление конфигурации порта в systemd-сервисе
if [ -f "$SERVICE_FILE" ]; then
    echo "Updating port configuration in systemd service file."
    sudo sed -i "s/-b 0.0.0.0:[0-9]*/-b 0.0.0.0:$PORT/" $SERVICE_FILE
else
    echo "Creating systemd service file at $SERVICE_FILE..."
    cat <<EOF | sudo tee $SERVICE_FILE
[Unit]
Description=Gunicorn instance to serve my Flask app
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=$TARGET_DIR
Environment="PATH=$TARGET_DIR/venv/bin"
ExecStart=$TARGET_DIR/venv/bin/gunicorn -w 4 main:app -b 0.0.0.0:$PORT

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

# Создание и настройка logs.service
LOGS_SERVICE_FILE="/etc/systemd/system/logs.service"
cat <<EOF | sudo tee $LOGS_SERVICE_FILE
[Unit]
Description=Run logs.py script

[Service]
Type=oneshot
ExecStart=$TARGET_DIR/venv/bin/python $TARGET_DIR/src/logs.py
EOF

# Создание и настройка logs.timer
LOGS_TIMER_FILE="/etc/systemd/system/logs.timer"
cat <<EOF | sudo tee $LOGS_TIMER_FILE
[Unit]
Description=Run logs.py every 30 seconds

[Timer]
OnBootSec=30s
OnUnitActiveSec=30s
Unit=logs.service

[Install]
WantedBy=timers.target
EOF

# Запрос на установку Telegram-бота
read -e -p "Would you like to install the Telegram bot service? (Y/N): " -i Y INSTALL_BOT

if [[ "$INSTALL_BOT" =~ ^[Yy]$ ]]; then
    BOT_SERVICE="/etc/systemd/system/telegram-bot.service"
    echo "Creating systemd service file for Telegram bot at $BOT_SERVICE..."

    # Создание systemd service файла для бота
    cat <<EOF | sudo tee $BOT_SERVICE
[Unit]
Description=Telegram Bot Service
After=network.target
StartLimitBurst=3
StartLimitIntervalSec=300

[Service]
User=root
Group=www-data
WorkingDirectory=$TARGET_DIR
Environment="PATH=$TARGET_DIR/venv/bin"
ExecStart=$TARGET_DIR/venv/bin/python $TARGET_DIR/src/vpn_bot.py
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

    # Проверка на существование файла .env, создание только если его нет
    if [ ! -f "$ENV_FILE" ]; then
        echo "Creating .env file at $ENV_FILE..."
        cat <<EOF > $ENV_FILE
BOT_TOKEN=<Enter API Token>
ADMIN_ID=<Enter your user ID>
EOF
        echo -e "\e[33m⚠️ Warning: The .env file has been created, but BOT_TOKEN is empty. Please fill it in before starting the bot!\e[0m"
        echo "Once you fill in the .env file, please manually start the bot using: sudo systemctl start telegram-bot"
    else
        echo ".env file already exists, skipping creation."
        
        # Перезагрузка бота
        echo "Restarting Telegram bot service..."
        sudo systemctl restart telegram-bot

    fi
fi  # Закрытие if для установки Telegram бота



# Перезагрузка systemd
echo "Reloading systemd daemon..."
sudo systemctl daemon-reload

# Перезапуск сервиса
echo "Restarting StatusOpenVPN service..."
sudo systemctl restart StatusOpenVPN

# Запуск Telegram-бота, если он был установлен
if [[ "$INSTALL_BOT" =~ ^[Yy]$ ]]; then
    echo "Starting Telegram bot service..."
    sudo systemctl restart telegram-bot
    sudo systemctl enable telegram-bot
fi

# Активация и запуск таймера
sudo systemctl enable --now logs.timer

# Получение внешнего IP-адреса сервера
EXTERNAL_IP=$(curl -4 -s ifconfig.me)

echo "Running initial admin setup..."
ADMIN_PASS=$(python3 -c "from main import add_admin; print(add_admin())")

# Вывод информации об обновлении
echo "--------------------------------------------"
echo -e "\e[32mUpdate completed successfully\e[0m"
echo "--------------------------------------------"
echo -e "Server is available at: \e[4;38;5;33mhttp://$EXTERNAL_IP:$PORT\e[0m"
echo "--------------------------------------------"

# Удаление скрипта установки
rm -f $TARGET_DIR/scripts/setup.sh