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

# Speak Chinese briefing text locally using Piper (offline) and play immediately.
# Usage:
#   piper_speak.sh "text..."
#   piper_speak.sh --in text.txt
# Options:
#   --volume 0-100   (default 100)

BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TTS_BIN="$BASE_DIR/bin/tts_piper.sh"
MODEL_DIR="$BASE_DIR/tts/piper/models"
MODEL_DEFAULT="$MODEL_DIR/zh_CN-huayan-medium.onnx"

IN_FILE=""
TEXT=""
VOLUME_PCT="100"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --in)
      IN_FILE="$2"; shift 2;;
    --volume)
      VOLUME_PCT="$2"; shift 2;;
    -h|--help)
      sed -n '1,120p' "$0"; exit 0;;
    *)
      if [[ -z "$TEXT" && -z "$IN_FILE" ]]; then
        TEXT="$1"; shift
      else
        echo "Unknown arg: $1" >&2
        exit 2
      fi
      ;;
  esac
done

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

# Pre-process text to improve pauses for TTS (turn semicolons into sentence breaks, add newlines)
CLEAN_TXT="$(mktemp)"
python3 - "$TMP_TXT" >"$CLEAN_TXT" <<'PY'
import re, sys

p = open(sys.argv[1], 'r', encoding='utf-8', errors='ignore').read().strip()

# --- Number normalization (speech-friendly) ---
# Years like 2026 -> 二零二六 (avoid reading as “两千零二十六”)
_digit_map = {'0':'零','1':'一','2':'二','3':'三','4':'四','5':'五','6':'六','7':'七','8':'八','9':'九'}

def year_to_zh(m: re.Match) -> str:
    y = m.group(1)
    return ''.join(_digit_map.get(ch, ch) for ch in y)

# Replace standalone 4-digit years (1900-2099), optionally followed by 年
p = re.sub(r'(?<!\d)((?:19|20)\d{2})(?=\s*年\b|\b)', lambda m: year_to_zh(m), p)

# --- Punctuation / pauses ---
# Make pauses more explicit for Piper
p = p.replace('；', '。').replace(';', '.').replace('—', '，').replace('–', '，').replace('•', '')
# Add line breaks after major punctuation to encourage natural phrasing
p = re.sub(r'([。！？.!?])\s*', r"\1\n", p)
p = re.sub(r'\n{2,}', '\n', p)

print(p)
PY

# Slightly slower, more sentence pauses (broadcast-like)
WAV="$($TTS_BIN --in "$CLEAN_TXT" --out "$BASE_DIR/tts/piper/out_$(date +%Y%m%d_%H%M%S).wav" \
  --model "$MODEL_DEFAULT" \
  --length-scale 1.24 \
  --noise-scale 0.05 \
  --noise-w-scale 0.05 \
  --sentence-silence 0.65)"
rm -f "$CLEAN_TXT"

# Set system volume to max (best-effort)
if command -v pactl >/dev/null 2>&1; then
  pactl set-sink-volume @DEFAULT_SINK@ "${VOLUME_PCT}%" || true
fi
if command -v amixer >/dev/null 2>&1; then
  amixer -q set Master "${VOLUME_PCT}%" || true
fi

# Play (best-effort)
if command -v paplay >/dev/null 2>&1; then
  paplay "$WAV"
elif command -v mpv >/dev/null 2>&1; then
  mpv --no-video "$WAV" >/dev/null 2>&1
elif command -v aplay >/dev/null 2>&1; then
  aplay "$WAV" >/dev/null 2>&1
else
  echo "No audio player found (paplay/mpv/aplay). WAV at: $WAV" >&2
  exit 3
fi

echo "$WAV"

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