#!/usr/bin/env bash
set -euo pipefail

MAIL="David.Delahaye@lirmm.fr"
REPO="${VIP_REPO:-git@github.com:delahayd/ip.git}"

TIME_LIMIT=""
ROBUST_TIME_LIMIT=0
MAX_CLAUSES=""
MODE=""
PORTFOLIO=""
DIR=""
HOME_DIR=""
LOGS_DIR=""
CASC=""
TPTP_DIR=""
MEM=""
MEM_PER_CPU=""
ONLYIP=0
LOCAL=0

usage() {
  cat <<EOF
Usage: benchs-meso [options]

Options:
  --time-limit <temps>
  --robust-time-limit
  --max-clauses <nombre>
  --mode <mode>
  --portfolio <legacy-modern|modern-legacy|legacy-only|modern-only|scheduled|feq-modern|experimental-casc|casc-aggressive|casc-240|casc-150|casc-150-lrs|casc-feq-probe>
  --dir <répertoire>
  --home <répertoire>
  --logs <répertoire>
  --casc <nom>
  --tptp <répertoire>
  --mem <mémoire SLURM, ex: 16G>
  --mem-per-cpu <mémoire SLURM par CPU, ex: 16G>
  --onlyvip / --onlyip
  --local
EOF
  exit 2
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --time-limit)
      [[ $# -ge 2 ]] || usage
      TIME_LIMIT="$2"
      shift 2
      ;;
    --robust-time-limit)
      ROBUST_TIME_LIMIT=1
      shift
      ;;
    --max-clauses)
      [[ $# -ge 2 ]] || usage
      MAX_CLAUSES="$2"
      shift 2
      ;;
    --mode)
      [[ $# -ge 2 ]] || usage
      MODE="$2"
      shift 2
      ;;
    --portfolio)
      [[ $# -ge 2 ]] || usage
      PORTFOLIO="$2"
      shift 2
      ;;
    --dir)
      [[ $# -ge 2 ]] || usage
      DIR="$2"
      shift 2
      ;;
    --home)
      [[ $# -ge 2 ]] || usage
      HOME_DIR="$2"
      shift 2
      ;;
    --logs)
      [[ $# -ge 2 ]] || usage
      LOGS_DIR="$2"
      shift 2
      ;;
    --casc)
      [[ $# -ge 2 ]] || usage
      CASC="$2"
      shift 2
      ;;
    --tptp)
      [[ $# -ge 2 ]] || usage
      TPTP_DIR="$2"
      shift 2
      ;;
    --mem)
      [[ $# -ge 2 ]] || usage
      MEM="$2"
      shift 2
      ;;
    --mem-per-cpu)
      [[ $# -ge 2 ]] || usage
      MEM_PER_CPU="$2"
      shift 2
      ;;
    --onlyvip|--onlyip)
      ONLYIP=1
      shift
      ;;
    --local)
      LOCAL=1
      shift
      ;;
    -h|--help)
      usage
      ;;
    *)
      echo "Unknown option: $1" >&2
      usage
      ;;
  esac
done

if [[ -n "$MEM" && -n "$MEM_PER_CPU" ]]; then
  echo "[ERROR] Use either --mem or --mem-per-cpu, not both." >&2
  exit 1
fi

if [[ "$ONLYIP" -eq 1 && -z "$CASC" ]]; then
  MAKE_TARGET="bench"
elif [[ "$ONLYIP" -eq 0 && -z "$CASC" ]]; then
  MAKE_TARGET="benchs"
elif [[ "$ONLYIP" -eq 1 && -n "$CASC" ]]; then
  MAKE_TARGET="bench-casc"
else
  MAKE_TARGET="benchs-casc"
fi

MAKE_ARGS=()

[[ -n "$TIME_LIMIT" ]] && MAKE_ARGS+=("TIME_LIMIT=$TIME_LIMIT")
[[ "$ROBUST_TIME_LIMIT" -eq 1 ]] && MAKE_ARGS+=("ROBUST_TIME_LIMIT=1")
[[ -n "$MAX_CLAUSES" ]] && MAKE_ARGS+=("MAX_CLAUSES=$MAX_CLAUSES")
[[ -n "$MODE" ]] && MAKE_ARGS+=("MODE=$MODE")
[[ -n "$PORTFOLIO" ]] && MAKE_ARGS+=("PORTFOLIO=$PORTFOLIO")
[[ -n "$DIR" ]] && MAKE_ARGS+=("DIR=$DIR")
[[ -n "$HOME_DIR" ]] && MAKE_ARGS+=("HOME_DIR=$HOME_DIR")
[[ -n "$LOGS_DIR" ]] && MAKE_ARGS+=("LOGS_DIR=$LOGS_DIR")
[[ -n "$CASC" ]] && MAKE_ARGS+=("CASC=$CASC")

if [[ -z "$TPTP_DIR" && -n "$DIR" ]]; then
  DIR_ABS="$(realpath "$DIR")"
  DIR_PARENT="$(dirname "$DIR_ABS")"
  DIR_GRANDPARENT="$(dirname "$DIR_PARENT")"
  for candidate in "$DIR_ABS" "$DIR_PARENT" "$DIR_GRANDPARENT"; do
    if [[ -d "$candidate/Axioms" ]]; then
      TPTP_DIR="$candidate"
      echo "[INFO] Auto-detected --tptp $TPTP_DIR from --dir $DIR" >&2
      break
    fi
  done
  if [[ -z "$TPTP_DIR" ]]; then
    echo "[WARN] No --tptp provided and no Axioms directory found near --dir $DIR" >&2
  fi
fi

LOCAL_VIP_DIR=""
if [[ "$LOCAL" -eq 1 ]]; then
  if [[ -d "vip" ]]; then
    LOCAL_VIP_DIR="$(realpath vip)"
  elif [[ -d "ip" ]]; then
    LOCAL_VIP_DIR="$(realpath ip)"
  else
    echo "[ERROR] --local selected, but neither ./vip nor ./ip was found." >&2
    exit 1
  fi
fi

STAMP="$(date +%Y%m%d_%H%M%S)"
WORKDIR="${TMPDIR:-$PWD}/vip_bench_${STAMP}"
SLURM_SCRIPT="bench_meso_${STAMP}.slurm"

cat > "$SLURM_SCRIPT" <<EOF
#!/usr/bin/env bash
#SBATCH --job-name=vip-bench
#SBATCH --output=vip-bench-%j.out
#SBATCH --error=vip-bench-%j.err
#SBATCH --mail-user=$MAIL
#SBATCH --mail-type=END,FAIL
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --partition=cpu-dedicated
$(if [[ -n "$MEM" ]]; then printf '#SBATCH --mem=%s\n' "$MEM"; fi)$(if [[ -n "$MEM_PER_CPU" ]]; then printf '#SBATCH --mem-per-cpu=%s\n' "$MEM_PER_CPU"; fi)

module load bioinfo-cirad
module load opam/2.1.2
export OPAMROOT=~/scratch_nokranii/.opam
eval $(opam env)

set -euo pipefail

echo "[INFO] Working directory: $WORKDIR"
mkdir -p "$WORKDIR"
cd "$WORKDIR"

EOF

if [[ "$LOCAL" -eq 1 ]]; then
  cat >> "$SLURM_SCRIPT" <<EOF
echo "[INFO] Using local VIP repository: $LOCAL_VIP_DIR"
ln -s "$LOCAL_VIP_DIR" vip
cd vip
export DUNE_BUILD_DIR="$WORKDIR/_build"
echo "[INFO] DUNE_BUILD_DIR=\$DUNE_BUILD_DIR"

EOF
else
  cat >> "$SLURM_SCRIPT" <<EOF
echo "[INFO] Cloning repository..."
git clone "$REPO" vip
cd vip
export DUNE_BUILD_DIR="$WORKDIR/_build"
echo "[INFO] DUNE_BUILD_DIR=\$DUNE_BUILD_DIR"

EOF
fi

cat >> "$SLURM_SCRIPT" <<EOF
echo "[INFO] Building VIP..."
make build
export VIP_BIN="\$DUNE_BUILD_DIR/default/src/main.exe"
if [[ ! -x "\$VIP_BIN" ]]; then
  echo "[ERROR] Freshly built VIP binary not found: \$VIP_BIN" >&2
  exit 1
fi
echo "[INFO] VIP_BIN=\$VIP_BIN"
echo "[INFO] VIP binary SHA256: \$(sha256sum "\$VIP_BIN" | awk '{print \$1}')"

EOF

if [[ -n "$TPTP_DIR" ]]; then
  cat >> "$SLURM_SCRIPT" <<EOF
export TPTP="$TPTP_DIR"
echo "[INFO] TPTP=\$TPTP"

EOF
fi

cat >> "$SLURM_SCRIPT" <<EOF
echo "[INFO] Running make target: $MAKE_TARGET"
echo "[INFO] Make args: ${MAKE_ARGS[*]}"

make "$MAKE_TARGET" ${MAKE_ARGS[*]}

echo "[INFO] Job finished."
EOF

JOB_ID="$(sbatch "$SLURM_SCRIPT" | awk '{print $NF}')"

echo "Submitted SLURM job: $JOB_ID"
echo "SLURM script: $SLURM_SCRIPT"
echo "Target: $MAKE_TARGET"
echo "Workdir: $WORKDIR"
echo "Local mode: $LOCAL"
