#!/bin/bash

# Определение цветов для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
NORMAL='\033[0m'


# Определение функций для логирования
log_fatal() {
  echo -e "[${RED}FATAL${NORMAL}] $1" >&2
}

log_success() {
  echo -e "[${GREEN}SUCCESS${NORMAL}] $1"
}

# Функция для вывода сообщения об ошибке и завершения скрипта
fatal() {
  echo
  log_fatal "Fatal Error Occurred: $1"
  log_fatal "Cannot continue installation."
  log_fatal "If you are unsure of what went wrong, you may wish to review the system logs or contact WU.UA devops engineers for further support"
  exit 1
}

# Функция для вывода сообщения об успешном выполнении
success() {
  log_success "$1"
}

# Функция для запроса номера тсо
get_tso_num() {
    read -r -p "Введите номер тсо: " TSO_NUM
}

# Функция для запроса пин-кода
get_pin() {
    read -r -s -p "Введите пин-код: " PIN
    echo -e "\n"
}

# Получаем номер тсо от пользователя
get_tso_num

# Получаем пин-код от пользователя
get_pin

# Подставляем пин-код в качестве user:pass
AUTH="$PIN:$PIN"

# Переменная с путем к файлу ovpn
ovpn_file="t$TSO_NUM.ovpn"

# Проверяем успешность скачивания
if curl -s -u "$AUTH" -o "$ovpn_file" https://install.tso.ideal.clothing/ovpn-certs/t"$TSO_NUM".tso.ideal.clothing.ovpn; then
    success "File downloaded successfully"
else
    fatal "File download error"
fi

# Проверка существования файла OVPN и доступа к нему
if [ ! -f "$ovpn_file" ]; then
  fatal "OVPN file not found or inaccessible."
fi

# Установка часового пояса
if timedatectl set-timezone Europe/Kyiv; then
  success "Setting timezone"
else
  fatal "Failed to set timezone."
fi

success "Installing required packages. Please wait..."

# Установка необходимых пакетов
if apt-get update -y >/dev/null 2>&1 && apt-get install htop net-tools openvpn ssh -y  >/dev/null 2>&1; then
  success "Installed required packages successfully!"
else
  fatal "Failed to install required packages."
fi

# Создание директории для SSH ключей и копирование ключей
if mkdir -p /root/.ssh; then
  success "Creating SSH directory"
else
  fatal "Failed to create SSH directory."
fi

cat <<EOF > /root/.ssh/authorized_keys
### main key
sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAID6HCMlX2FrFzY/Xha1Ui0KW8NBWgD3MUO/4nd4cWY34AAAAEnNzaDpteS1zc2gtMmZhLWtleQ==
#### emergency key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII0KiZHiCsDX9I+TJrG0con0BmVde7ObkTQ72Of7SHp+
EOF

if [ $? -eq 0 ]; then
  success "Adding SSH keys"
else
  fatal "Failed to add SSH keys."
fi

# Перемещение файла ovpn
if mkdir -p /etc/openvpn/client && mv "$ovpn_file" /etc/openvpn/client.conf; then
  success "Moving ovpn file"
else
  fatal "Failed to move ovpn file."
fi

# Перезапуск сервиса OpenVPN и включение его в автозагрузку
if systemctl enable --now openvpn@client; then
  success "Enabling OpenVPN service"
else
  fatal "Failed to enable OpenVPN service."
fi

# Проверка настроек OpenVPN
if systemctl is-enabled openvpn@client | grep -q "enabled"; then
  success "OpenVPN is enabled"
else
  fatal "OpenVPN is not enabled"
fi

# Проверка активности сервиса OpenVPN
if systemctl is-active --quiet openvpn@client; then
  success "OpenVPN service is active"
else
  fatal "OpenVPN service is not active"
fi

# Попытки подключения к VPN сети
attempts=30
for (( i=1; i<=attempts; i++ )); do
  if ping -c 1 10.111.0.1 >/dev/null; then
    success "Successfully connected to VPN network"
    success "Thank you for your help in installing TSO! \nYou can close the terminal with the key combination ctrl+d and report the completed installation."
    exit 0
  else
    echo "Attempt $i: Failed to connect to VPN network. Retrying..."
  fi
done

# Если все попытки неудачны, завершаем скрипт с сообщением об ошибке
fatal "Failed to connect to VPN network after $attempts attempts."
