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

# Local Piper TTS wrapper (offline)
# Usage:
#   tts_piper.sh "你好，欢迎来到0基础硬件入门。" --out out.wav
#   tts_piper.sh --in text.txt --out out.wav

BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VENV="$BASE_DIR/.venv_piper"
PIPER_BIN="$VENV/bin/piper"
MODEL_DIR="$BASE_DIR/tts/piper/models"
# Default voice
MODEL="$MODEL_DIR/zh_CN-huayan-medium.onnx"
CONFIG="$MODEL_DIR/zh_CN-huayan-medium.onnx.json"

# Optional tuning (passed through to piper)
LENGTH_SCALE=""
NOISE_SCALE=""
NOISE_W_SCALE=""
SENTENCE_SILENCE=""
VOLUME=""

TEXT=""
IN_FILE=""
OUT_FILE=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --out)
      OUT_FILE="$2"; shift 2;;
    --in)
      IN_FILE="$2"; shift 2;;
    --model)
      MODEL="$2"; CONFIG="${2}.json"; shift 2;;
    --length-scale|--length_scale)
      LENGTH_SCALE="$2"; shift 2;;
    --noise-scale|--noise_scale)
      NOISE_SCALE="$2"; shift 2;;
    --noise-w-scale|--noise_w_scale|--noise-w|--noise_w)
      NOISE_W_SCALE="$2"; shift 2;;
    --sentence-silence|--sentence_silence)
      SENTENCE_SILENCE="$2"; shift 2;;
    --volume)
      VOLUME="$2"; shift 2;;
    -h|--help)
      sed -n '1,80p' "$0"; exit 0;;
    *)
      if [[ -z "$TEXT" && -z "$IN_FILE" ]]; then
        TEXT="$1"; shift
      else
        echo "Unknown arg: $1" >&2
        exit 2
      fi
      ;;
  esac
done

if [[ -z "$OUT_FILE" ]]; then
  OUT_FILE="$BASE_DIR/tts/piper/out_$(date +%Y%m%d_%H%M%S).wav"
fi

mkdir -p "$(dirname "$OUT_FILE")"

if [[ ! -x "$PIPER_BIN" ]]; then
  echo "Missing piper binary at: $PIPER_BIN" >&2
  exit 1
fi
if [[ ! -f "$MODEL" || ! -f "$CONFIG" ]]; then
  echo "Missing model/config in: $MODEL_DIR" >&2
  exit 1
fi

TMP_IN=""
if [[ -n "$IN_FILE" ]]; then
  TMP_IN="$IN_FILE"
else
  TMP_IN="$(mktemp)"
  printf "%s\n" "$TEXT" > "$TMP_IN"
fi

ARGS=("$PIPER_BIN" -m "$MODEL" -c "$CONFIG" -i "$TMP_IN" -f "$OUT_FILE")

[[ -n "$LENGTH_SCALE" ]] && ARGS+=(--length_scale "$LENGTH_SCALE")
[[ -n "$NOISE_SCALE"  ]] && ARGS+=(--noise_scale "$NOISE_SCALE")
[[ -n "$NOISE_W_SCALE" ]] && ARGS+=(--noise_w_scale "$NOISE_W_SCALE")
[[ -n "$SENTENCE_SILENCE" ]] && ARGS+=(--sentence_silence "$SENTENCE_SILENCE")
[[ -n "$VOLUME" ]] && ARGS+=(--volume "$VOLUME")

"${ARGS[@]}" >/dev/null

if [[ -z "$IN_FILE" ]]; then
  rm -f "$TMP_IN"
fi

echo "$OUT_FILE"
