#!/usr/bin/env bash
# script du tp duckdb : ./scripts/duckdb_lab.sh [setup|queries|large|benchmark|report|cleanup|all]
set -euo pipefail

cd "$(dirname "$0")/.."

# le bucket s3 (sur onyxia c'est le namespace kubernetes)
if [ -z "${BUCKET_URI:-}" ]; then
  LAB_BUCKET_NAME="${LAB_BUCKET_NAME:-${KUBERNETES_NAMESPACE:?il faut LAB_BUCKET_NAME ou KUBERNETES_NAMESPACE}}"
  export LAB_BUCKET_NAME
  BUCKET_URI="s3://$LAB_BUCKET_NAME"
fi

is_s3() {
  [[ "$BUCKET_URI" == s3://* ]]
}

obj_exists() {
  if is_s3; then
    aws s3 --profile 'default' ls "$BUCKET_URI/$1" > /dev/null 2>&1
  else
    [ -f "$BUCKET_URI/$1" ]
  fi
}

obj_put() {
  if is_s3; then
    aws s3 --profile 'default' cp "$1" "$BUCKET_URI/$2"
  else
    mkdir -p "$(dirname "$BUCKET_URI/$2")"
    cp "$1" "$BUCKET_URI/$2"
  fi
}

obj_rm_prefix() {
  if is_s3; then
    aws s3 --profile 'default' rm "$BUCKET_URI/$1" --recursive
  else
    rm -rf "${BUCKET_URI:?}/$1"
  fi
}

run_sql() {
  duckdb -bail analytics.duckdb -init init.sql < "sql/$1"
}


setup() {
  if ! is_s3; then
    mkdir -p "$BUCKET_URI/bronze" "$BUCKET_URI/analytics" "$BUCKET_URI/large"
  fi

  # init.sql avec le nom du bucket
  cat > init.sql <<SQL
SET VARIABLE bucket = '$BUCKET_URI';
SET TimeZone = 'UTC';
SQL

  # si les csv sont pas dans le bronze on les refait
  if ! obj_exists bronze/users.csv || ! obj_exists bronze/orders.csv; then
    uv run dataset-users -o csv > users.csv
    uv run dataset-orders -o csv > orders.csv
    obj_put users.csv bronze/users.csv
    obj_put orders.csv bronze/orders.csv
  fi
}

queries() {
  for f in 00_bronze 01_load_checks 02_analytics 03_exercises 04_parquet; do
    echo "== $f =="
    run_sql "$f.sql"
  done
}

large() {
  uv run dataset-orders -u 5000 -o csv > orders_large.csv
  ls -lh orders_large.csv
  obj_put orders_large.csv large/orders.csv
  run_sql 05_large.sql
}

benchmark() {
  for q in \
    "FROM read_csv(getvariable('bucket') || '/large/orders.csv', strict_mode=false) SELECT product, sum(quantity) GROUP BY product" \
    "FROM read_parquet(getvariable('bucket') || '/large/orders.parquet') SELECT product, sum(quantity) GROUP BY product" \
    "FROM read_parquet(getvariable('bucket') || '/large/orders.parquet') SELECT count(*) WHERE date >= '2048-06-01'"
  do
    echo "$q"
    duckdb -init init.sql -c "SET enable_external_file_cache = false; EXPLAIN ANALYZE $q" 2>/dev/null | grep -E 'in:|#GET|Total Time' || true
  done
}

report() {
  if ! is_s3; then
    echo "orders-report marche seulement avec s3, on saute" >&2
    return 0
  fi
  uv run orders-report
  uv run orders-report -p cookie
}

cleanup() {
  obj_rm_prefix analytics/
  obj_rm_prefix large/
  rm -f orders_large.csv
}


case "${1:-all}" in
  setup)     setup ;;
  queries)   setup; queries ;;
  large)     setup; large ;;
  benchmark) setup; benchmark ;;
  report)    setup; report ;;
  cleanup)   cleanup ;;
  all)       setup; queries; large; benchmark; report ;;
  *)         echo "Usage: $0 [setup|queries|large|benchmark|report|cleanup|all]" >&2; exit 1 ;;
esac
