#!/bin/bash
# WF 2026-03-01
# Parameterized quick start script for RDF datasets
# see https://github.com/WolfgangFahl/pyomnigraph/issues/32

# Default values
DATASET="wikidata_triplestores"
TRIPLESTORE="blazegraph"
DOWNLOAD_URL="https://genwiki-farm.genealogy.net/downloads"
DO_DOWNLOAD="false"
OPEN_WEBUI="true"

# Source bash_messages with fallback
if ! type success &>/dev/null; then
    BASH_MP="$HOME/source/bash/mp"
    if [[ -f "$BASH_MP/bash_messages" ]]; then
        source "$BASH_MP/bash_messages"
    else
        # Fallback implementations
        error() { echo "✗ Error: $1" >&2; exit "${2:-1}"; }
        success() { echo "✓ $1"; }
        action() { echo "➜ $1"; }
        warn() { echo "⚠ $1"; }
    fi
fi


#
# usage - show help
#
usage() {
  cat << EOF
usage: $0 [options]
  --dataset <name>      Dataset name (default: wikidata_triplestores)
  --triplestore <name>  Triple store to use (default: blazegraph)
  --download            Download dataset (for big external datasets)
  --url <url>           Download URL (default: auto-generated from dataset name)
  -q|--query <query>    Query name with optional @params (e.g., "count" or "search@term=Berlin")
  --no-webui            Don't open web UI after loading
  -h|--help             Show this help message

This script uses RDF dumps from ~/.omnigraph/rdf_dumps/<dataset>/
For creating dumps, use rdfdump, for example:
  rdfdump -ds gov_full -4o --dump --limit 100000

The -4o flag uses the omnigraph default location.

See https://wiki.bitplan.com/index.php/Pyomnigraph#Quickstart for more info.

Examples:
  $0
  $0 --dataset gov_full --triplestore jena
  $0 --dataset gov_full --download -q "count"
  $0 -q "Triplestores"
EOF
  exit 1
}


#
# download_dataset - download the dataset if not cached
# $1: l_tar_file - path to tar file
# $2: l_url - download URL
#
download_dataset() {
  local l_tar_file="$1"
  local l_url="$2"

  if [[ ! -f "$l_tar_file" ]]; then
    action "Downloading dataset from $l_url"
    curl -L -o "$l_tar_file" "$l_url" || error "Download failed"
    success "Download complete"
  else
    success "Using cached: $l_tar_file"
  fi
}

#
# extract_dataset - extract dataset if not already extracted
# $1: l_download_dir - directory containing the tar file
# $2: l_tar_file - path to tar file
#
extract_dataset() {
  local l_download_dir="$1"
  local l_tar_file="$2"

  # Check if extraction already happened (look for .ttl or .nt files)
  if find "$l_download_dir" -maxdepth 1 -type f \( -name "*.ttl" -o -name "*.nt" -o -name "*.rdf" \) -print -quit | grep -q .; then
    success "Already extracted"
  else
    action "Extracting $l_tar_file"
    cd "$l_download_dir" || error "Cannot cd to $l_download_dir"
    tar -xzf "$l_tar_file" || error "Extraction failed"
    success "Extracted"
  fi
}

#
# start_triplestore - start the triplestore
# $1: l_triplestore - name of triplestore
#
start_triplestore() {
  local l_triplestore="$1"
  action "Starting $l_triplestore"
  omnigraph -s "$l_triplestore" --cmd start || error "Failed to start $l_triplestore"
}

#
# load_dataset - load dataset into triplestore
# $1: l_triplestore - name of triplestore
# $2: l_dataset - dataset name
#
load_dataset() {
  local l_triplestore="$1"
  local l_dataset="$2"
  action "Loading $l_dataset dataset into $l_triplestore"
  omnigraph -s "$l_triplestore" --cmd load --datasets "$l_dataset" || error "Failed to load dataset"
  success "$l_dataset loaded"
}

#
# open_webui - open the web UI with optional query
# $1: l_triplestore - name of triplestore
#
open_webui() {
  local l_triplestore="$1"
  omnigraph -s "$l_triplestore" --cmd webui
}

#
# run_quickstart - main quickstart workflow
# $1: l_dataset - dataset name
# $2: l_triplestore - triplestore name
# $3: l_do_download - whether to download (true/false)
# $4: l_download_url_base - base download URL
# $5: l_open_webui - whether to open webui (true/false)
#
run_quickstart() {
  local l_dataset="$1"
  local l_triplestore="$2"
  local l_do_download="$3"
  local l_download_url_base="$4"
  local l_open_webui="$5"

  local l_download_dir="${HOME}/.omnigraph/rdf_dumps/$l_dataset"

  action "Dataset: $l_dataset"
  action "Triple store: $l_triplestore"

  # Only download and extract if --download flag is set
  if [[ "$l_do_download" == "true" ]]; then
    # Calculate full download URL from base URL and dataset name
    local l_full_url="${l_download_url_base}/${l_dataset}.tar.gz"
    local l_tar_file="${l_download_dir}/${l_dataset}.tar.gz"
    mkdir -p "$l_download_dir" || error "Cannot create directory $l_download_dir"
    download_dataset "$l_tar_file" "$l_full_url"
    extract_dataset "$l_download_dir" "$l_tar_file"
  else
    # Verify RDF dumps exist
    if [[ ! -d "$l_download_dir" ]]; then
      error "RDF dump directory not found: $l_download_dir
Use rdfdump to create dumps, e.g.:
  rdfdump -ds $l_dataset -4o --dump --limit 100000
Or use --download flag for external datasets"
    fi
  fi

  start_triplestore "$l_triplestore"
  load_dataset "$l_triplestore" "$l_dataset"

  if [[ "$l_open_webui" == "true" ]]; then
    open_webui "$l_triplestore"
  else
    success "Done!"
  fi
}

# Main loop
case $# in
  *)
    while [[ "$1" != "" ]]; do
      case "$1" in
        -h|--help)
          usage
          ;;
        --dataset)
          DATASET="$2"
          shift
          ;;
        --triplestore)
          TRIPLESTORE="$2"
          shift
          ;;
        --download)
          DO_DOWNLOAD="true"
          ;;
        --url)
          DOWNLOAD_URL="$2"
          shift
          ;;
        --no-webui)
          OPEN_WEBUI="false"
          ;;
        *)
          error "Unknown option: $1" 1
          ;;
      esac
      shift
    done

    run_quickstart "$DATASET" "$TRIPLESTORE" "$DO_DOWNLOAD" "$DOWNLOAD_URL" "$OPEN_WEBUI"
    ;;
esac
