#!/bin/sh

# Пути по умолчанию
DEFAULT_CFGPATH="/etc/pfsdn.json"
DEFAULT_LIBRARY="/var/lib/pfsdn"
DEFAULT_REPO_URL="https://repo.kirillius.ru/apps/pf/"

# Функция для извлечения значений из аргументов
get_arg_value() {
    local arg_name="$1"
    local default_value="$2"
    local value="$default_value"

    # Ищем аргумент в формате -arg=value или --arg=value
    for arg in "${@:3}"; do
        case "$arg" in
            -$arg_name=*|--$arg_name=*)
                value="${arg#*=}"
                break
                ;;
        esac
    done
    echo "$value"
}

# Получаем пути из аргументов или используем значения по умолчанию
CFGPATH=$(get_arg_value "c" "$DEFAULT_CFGPATH" "$@")
LIBRARY=$(get_arg_value "l" "$DEFAULT_LIBRARY" "$@")
REPO_URL=$(get_arg_value "r" "$DEFAULT_REPO_URL" "$@")

# Выводим рабочие каталоги
echo "Config path: $CFGPATH"
echo "Library path: $LIBRARY"
echo "Repository URL: $REPO_URL"

# Проверяем наличие Java в системе и версию
if ! command -v java >/dev/null 2>&1; then
    echo "Java not found. Please install java, openjdk or JRE" >&2
    exit 1
fi

# Проверяем версию Java (должна быть >= 21)
check_java_version() {
    local java_version
    java_version=$(java -version 2>&1 | head -n 1 | sed 's/.*"\([0-9]*\)\.[0-9]*\.[0-9]*".*/\1/')

    if [ -z "$java_version" ] || [ "$java_version" -lt 21 ]; then
        echo "Java version 21 or higher is required. Found version: $java_version" >&2
        return 1
    fi
    echo "Java version check passed: $java_version"
    return 0
}

if ! check_java_version; then
    exit 1
fi

# Проверяем и создаем директорию LIBRARY если не существует
if [ ! -d "$LIBRARY" ]; then
    echo "Library directory not found: $LIBRARY"
    echo "Creating directory: $LIBRARY"
    if ! mkdir -p "$LIBRARY"; then
        echo "Failed to create library directory: $LIBRARY" >&2
        exit 1
    fi
    echo "Directory created successfully"
fi

# Функция для поиска последней версии в директории
find_local_version() {
    find "$LIBRARY" -maxdepth 1 -name "*.pfapp" -type f | grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.pfapp' | sort -V | tail -n 1
}

# Функция для скачивания версии с веб-страницы
download_latest_version() {
    local repo_url="$REPO_URL"
    echo "Searching for latest version on $repo_url..."

    # Получаем HTML страницу и извлекаем ссылки на .pfapp файлы
    local latest_file=$(curl -s "$repo_url" | grep -oE 'href="[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.pfapp"' | sed 's/href="//g' | sed 's/"//g' | sort -V | tail -n 1)

    if [ -z "$latest_file" ]; then
        echo "No .pfapp files found on the repository" >&2
        return 1
    fi

    local download_url="${repo_url}${latest_file}"
    local local_path="$LIBRARY/$latest_file"

    echo "Downloading version: $latest_file"
    echo "From: $download_url"
    echo "To: $local_path"

    # Скачиваем файл
    if curl -s -o "$local_path" "$download_url"; then
        echo "Successfully downloaded $latest_file"
        # Возвращаем ТОЛЬКО путь к файлу, без дополнительных сообщений
        echo "$local_path"
    else
        echo "Failed to download $latest_file" >&2
        return 1
    fi
}

cleanup() {
    echo "Received signal, stopping child process..."
    kill $CPID 2>/dev/null
    wait $CPID 2>/dev/null
    exit 0
}

trap cleanup TERM INT
while true; do

  # Находим последнюю версию файла
  VER_FILE=$(find_local_version)

  # Если не нашли файлы локально, скачиваем с веб-страницы
  if [ -z "$VER_FILE" ]; then
      echo "No local .pfapp files found, downloading from repository..."
      # Сохраняем вывод функции в временную переменную, чтобы показать сообщения
      DOWNLOAD_OUTPUT=$(download_latest_version)
      if [ $? -ne 0 ]; then
          echo "Failed to download application file" >&2
          exit 1
      fi
      # Извлекаем последнюю строку (путь к файлу) из вывода
      VER_FILE=$(echo "$DOWNLOAD_OUTPUT" | tail -n 1)

      # Выводим все сообщения кроме последней строки
      echo "$DOWNLOAD_OUTPUT" | head -n -1
  else
      # Выводим информацию о найденной локальной версии
      VER=$(basename "$VER_FILE")
      VER="${VER%.pfapp}"
      echo "Using local version: $VER"
  fi

  # Извлекаем только имя файла (без пути)
  VER=$(basename "$VER_FILE")

  # Убираем расширение .pfapp чтобы получить чистую версию
  VER="${VER%.pfapp}"

  # Выводим финальную информацию о версии
  echo "Starting application version: $VER"

  # Функция для запуска Java
  run_java() {
      java -Xmx256m -jar "$LIBRARY/$VER.pfapp" -c="$CFGPATH" -l="$LIBRARY" -r="$REPO_URL" &
      CPID=$!
      wait $CPID
  }

# Запускаем Java с возможностью перезапуска при коде возврата 42

  run_java
  EXIT_CODE=$?

  if [ $EXIT_CODE -eq 42 ]; then
      echo "Restarting application (exit code 42)..."
      continue
  else
      exit $EXIT_CODE
  fi
done