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

CLI_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd -P)"
PREFIX_DIR="$(dirname "$CLI_DIR")"

DATADIR="${FUFIHLA_DATADIR:-$PREFIX_DIR/share/fufihla}"
SCRIPTS_DIR="$DATADIR/scripts"

IN_FA=""
OUT_DIR=""
REF_DIR_DEFAULT="$DATADIR/dps-dat"
REF_DIR="${FUFIHLA_REF_DIR:-$REF_DIR_DEFAULT}"
DEBUG=0
MODE="hifi"
HOM_THRESHOLD=4

usage() {
  echo "Usage: fufihla --fa reads.fa.gz --out outdir [--refdir dir] [--hom-threshold FLOAT] [--debug] [--ont|--hifi]"
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --fa) IN_FA="$2"; shift 2 ;;
    --out) OUT_DIR="$2"; shift 2 ;;
    --hom-threshold) HOM_THRESHOLD="$2"; shift 2 ;;
    --refdir) REF_DIR="$2"; shift 2 ;;
    --debug) DEBUG=1; shift ;;
    --ont) MODE="ont"; shift ;;
    --hifi) MODE="hifi"; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown or positional arg: $1"; usage; exit 2 ;;
  esac
done

[[ -n "$IN_FA" ]]   || { echo "[fufihla] --fa required"; usage; exit 2; }
[[ -n "$OUT_DIR" ]] || { echo "[fufihla] --out required"; usage; exit 2; }

# Check references
if [[ ! -s "$REF_DIR/ref.gene.fa.gz" ]]; then
  echo "[fufihla] ERROR: $REF_DIR/ref.gene.fa.gz not found." >&2
  echo "[fufihla] Run:  fufihla-ref-prep   in a new folder to build refs." >&2
  exit 1
fi

export FUFIHLA_REF_DIR="$REF_DIR"
export FUFIHLA_DEBUG="$DEBUG"
export FUFIHLA_DEFAULT_GENES="$REF_DIR/genes.list"
export FUFIHLA_HOM_THRESHOLD="$HOM_THRESHOLD"

if [[ "$MODE" == "ont" ]]; then
  echo "[fufihla] Running in ONT mode ..."
  bash "$SCRIPTS_DIR/FuFiHLA_nano.sh" "$IN_FA" "$OUT_DIR" \
    1>"$OUT_DIR.out" \
    2>"$OUT_DIR.err"
else
  echo "[fufihla] Running in HiFi mode ..."
  bash "$SCRIPTS_DIR/FuFiHLA.sh" "$IN_FA" "$OUT_DIR" \
    1>"$OUT_DIR.out" \
    2>"$OUT_DIR.err"
fi

if [[ "$DEBUG" -ne 1 ]]; then
  echo "[fufihla] Cleaning intermediates in $OUT_DIR ..."
  rm -rf "$OUT_DIR"/{bam,fas,lists,paf} \
         "$OUT_DIR"/s* \
         "$OUT_DIR"/vcf* \
         "$OUT_DIR"/allele_to_reads.txt \
         "$OUT_DIR"/read_assignment.txt 2>/dev/null || true
  echo "[fufihla] Kept only consensus/ and final outputs."
fi
