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

usage() {
    cat <<'EOF'
Usage:
  ./run_ff_3c_waveform_plot.sh
  ./run_ff_3c_waveform_plot.sh disp
  ./run_ff_3c_waveform_plot.sh vel
  ./run_ff_3c_waveform_plot.sh acc

The optional positional argument selects the waveform quantity/observed-file
extension. If omitted, QUANTITY is used; its default is "disp".

Timing note:
  Synthetic waveforms were already shifted by ttshift in the inversion code.
  APPLY_TTSHIFT therefore defaults to 0 to avoid applying the shift twice.
  Set APPLY_TTSHIFT=1 only for a deliberate diagnostic comparison.

Optional environment overrides:
  PYTHON_CMD=/path/to/python
  PLOT_SCRIPT=/path/to/ff_3c_waveform_plot.py
  DATA_DIR=/path/to/waveform_directory
  REG_INV_OUT=reg_inv.out.inc_gps_seg2_rdf3_side3_rakeval_multime3
  VR_DECIMALS=2
  TTSHIFT_DECIMALS=2
  APPLY_TTSHIFT=0
  TTSHIFT_SIGN=1
  MAKE_CORRELATION_ANALYSIS=1
  CC_MAX_LAG_S=10.0
  CC_MIN_CORRELATION=0.0
  CC_MIN_VR_IMPROVEMENT=0.0
  CC_OUTPUT_CSV=ttshift_correlation.csv
  TTSHIFT_UPDATE_FILE=ttshift_update.txt
  TTSHIFT_UPDATE_GPS_LINE="29 gps_weightIn ngl_disp_select_up0.txt"
  QUANTITY=disp
  EQ_ORIGIN_TIME=2024-12-05T18:44:16.460000
  PLOT_FILE=ff_3c_waveform_plot.pdf
  NORMALIZATION=station
  INPUT_UNIT_FACTOR=1.0
  DISPLAY_UNIT=cm
  STATION_ORDER=azimuth
  TIME_MIN=
  TIME_MAX=
  STATION_LABEL_SIZE=7
  VR_FONT_SIZE=7
  AZ_FONT_SIZE=6
  DIST_FONT_SIZE=6
  METADATA_LABEL_SIZE=6
  LEGEND_LOC="upper right"
  STATIONS_PER_PAGE=18
  Y_AXIS_LABEL=
  ANNOTATE_STATION_ABSMAX=0
  SHOW_FOOTER=1
  INCLUDE_STATIONS=
  EXCLUDE_STATIONS=
  STATION_FILE=
  MIN_DISTANCE_KM=
  MAX_DISTANCE_KM=
  MIN_AZIMUTH_DEG=
  MAX_AZIMUTH_DEG=
  COMPONENTS_TO_PLOT=E,N,Z
  COMPONENT_TITLE_SIZE=14
  AXIS_LABEL_SIZE=10
  TICK_LABEL_SIZE=9
  LEGEND_FONT_SIZE=9
  FOOTER_FONT_SIZE=7
  MAX_AMP_FONT_SIZE=6
  MAX_AMP_DECIMALS=2
  MAX_AMP_X=0.01
  MAX_AMP_Y_OFFSET=0.18
  STATION_NAME_X=0.99
  VR_X=0.01
  VR_Y_OFFSET=0.10
  STATION_NAME_Y_OFFSET=0.10
  AZ_X=0.99
  AZ_Y_OFFSET=0.10
  DIST_X=0.99
  DIST_Y_OFFSET=0.06

Examples:
  ./run_ff_3c_waveform_plot.sh
  ./run_ff_3c_waveform_plot.sh disp
  DATA_DIR=/path/to/data ./run_ff_3c_waveform_plot.sh vel
  PYTHON_CMD=python3 PLOT_SCRIPT=/path/to/ff_3c_waveform_plot.py \
      ./run_ff_3c_waveform_plot.sh acc
EOF
}

[[ $# -le 1 ]] || { usage >&2; exit 2; }

case "${1:-}" in
    -h|--help)
        usage
        exit 0
        ;;
esac

PYTHON_CMD=${PYTHON_CMD:-/data/seis01/taira/miniconda3/envs/netops/bin/python}
PLOT_SCRIPT=${PLOT_SCRIPT:-ff_3c_waveform_plot.py}

DATA_DIR=${DATA_DIR:-/data/seis02/taira/BSL_MT_Training/mendo2024/ff_loop_test_rakeval/work_ff_inc_gps_seg2_rdf3_side3_rakeval_multime3_loop/inv_para_275.00_84.00_-135.00+-225.00_20_20_40.00_40.00_40.374_-125.022_9.0_-5.00_4.00_0_0_2_567/source_para_2.20_1.00_0.0002.seg2_rdf3_side3_rakeval_multime3/280.00_84.00_-135.00+-225.00_20_20_40.00_40.00_40.330560_-124.695681_1.043825_10.00_4.00_0/source_para2_2.80_delays_0.0_0.0_0.5}
REG_INV_OUT=${REG_INV_OUT:-reg_inv.out.inc_gps_seg2_rdf3_side3_rakeval_multime3}
VR_DECIMALS=${VR_DECIMALS:-2}
TTSHIFT_DECIMALS=${TTSHIFT_DECIMALS:-2}

# apply tme shift
#APPLY_TTSHIFT=${APPLY_TTSHIFT:-0}
# not apply time shift
APPLY_TTSHIFT=${APPLY_TTSHIFT:-0}

TTSHIFT_SIGN=${TTSHIFT_SIGN:-1}
MAKE_CORRELATION_ANALYSIS=${MAKE_CORRELATION_ANALYSIS:-1}
CC_MAX_LAG_S=${CC_MAX_LAG_S:-10.0}
CC_MIN_CORRELATION=${CC_MIN_CORRELATION:-0.0}
CC_MIN_VR_IMPROVEMENT=${CC_MIN_VR_IMPROVEMENT:-0.0}
CC_OUTPUT_CSV=${CC_OUTPUT_CSV:-ttshift_correlation.csv}
TTSHIFT_UPDATE_FILE=${TTSHIFT_UPDATE_FILE:-ttshift_update.txt}
TTSHIFT_UPDATE_GPS_LINE=${TTSHIFT_UPDATE_GPS_LINE:-29 gps_weightIn ngl_disp_select_up0.txt}

QUANTITY=${1:-${QUANTITY:-disp}}
EQ_ORIGIN_TIME=${EQ_ORIGIN_TIME:-2024-12-05T18:44:16.460000}
PLOT_FILE=${PLOT_FILE:-ff_3c_waveform_plot.pdf}
NORMALIZATION=${NORMALIZATION:-station}
INPUT_UNIT_FACTOR=${INPUT_UNIT_FACTOR:-1.0}
DISPLAY_UNIT=${DISPLAY_UNIT:-cm}
STATION_SPACING=${STATION_SPACING:-1.0}
WAVEFORM_HALF_HEIGHT=${WAVEFORM_HALF_HEIGHT:-0.42}
STATION_ORDER=${STATION_ORDER:-azimuth}
TIME_MIN=${TIME_MIN:-}
TIME_MAX=${TIME_MAX:-}
STATION_LABEL_SIZE=${STATION_LABEL_SIZE:-7}
VR_FONT_SIZE=${VR_FONT_SIZE:-7}
AZ_FONT_SIZE=${AZ_FONT_SIZE:-7}
DIST_FONT_SIZE=${DIST_FONT_SIZE:-7}
METADATA_LABEL_SIZE=${METADATA_LABEL_SIZE:-7}
LEGEND_LOC=${LEGEND_LOC:-upper right}
STATIONS_PER_PAGE=${STATIONS_PER_PAGE:-18}
Y_AXIS_LABEL=${Y_AXIS_LABEL:-}
ANNOTATE_STATION_ABSMAX=${ANNOTATE_STATION_ABSMAX:-0}
SHOW_FOOTER=${SHOW_FOOTER:-1}
INCLUDE_STATIONS=${INCLUDE_STATIONS:-}
EXCLUDE_STATIONS=${EXCLUDE_STATIONS:-}
STATION_FILE=${STATION_FILE:-}
MIN_DISTANCE_KM=${MIN_DISTANCE_KM:-}
MAX_DISTANCE_KM=${MAX_DISTANCE_KM:-}
MIN_AZIMUTH_DEG=${MIN_AZIMUTH_DEG:-}
MAX_AZIMUTH_DEG=${MAX_AZIMUTH_DEG:-}
COMPONENTS_TO_PLOT=${COMPONENTS_TO_PLOT:-E,N,Z}
COMPONENT_TITLE_SIZE=${COMPONENT_TITLE_SIZE:-14}
AXIS_LABEL_SIZE=${AXIS_LABEL_SIZE:-10}
TICK_LABEL_SIZE=${TICK_LABEL_SIZE:-9}
LEGEND_FONT_SIZE=${LEGEND_FONT_SIZE:-9}
FOOTER_FONT_SIZE=${FOOTER_FONT_SIZE:-7}
MAX_AMP_FONT_SIZE=${MAX_AMP_FONT_SIZE:-7}
MAX_AMP_DECIMALS=${MAX_AMP_DECIMALS:-2}
MAX_AMP_X=${MAX_AMP_X:-0.01}
MAX_AMP_Y_OFFSET=${MAX_AMP_Y_OFFSET:-0.18}
STATION_NAME_X=${STATION_NAME_X:-0.99}
VR_X=${VR_X:-0.01}
VR_Y_OFFSET=${VR_Y_OFFSET:-0.10}
STATION_NAME_Y_OFFSET=${STATION_NAME_Y_OFFSET:-0.10}
AZ_X=${AZ_X:-0.99}
AZ_Y_OFFSET=${AZ_Y_OFFSET:-0.10}
DIST_X=${DIST_X:-0.99}
DIST_Y_OFFSET=${DIST_Y_OFFSET:-0.18}

case "$QUANTITY" in
    disp|vel|acc) ;;
    *)
        echo "ERROR: unsupported waveform quantity: $QUANTITY" >&2
        echo "Expected one of: disp, vel, acc" >&2
        usage >&2
        exit 2
        ;;
esac

COMMON_ARGS=(
    --data-dir "$DATA_DIR"
    --reg-inv-out "$REG_INV_OUT"
    --vr-decimals "$VR_DECIMALS"
    --ttshift-decimals "$TTSHIFT_DECIMALS"
    --ttshift-sign "$TTSHIFT_SIGN"
    --cc-max-lag-s "$CC_MAX_LAG_S"
    --cc-min-correlation "$CC_MIN_CORRELATION"
    --cc-min-vr-improvement "$CC_MIN_VR_IMPROVEMENT"
    --cc-output-csv "$CC_OUTPUT_CSV"
    --ttshift-update-file "$TTSHIFT_UPDATE_FILE"
    --ttshift-update-gps-line "$TTSHIFT_UPDATE_GPS_LINE"
    --quantity "$QUANTITY"
    --eq-origin-time "$EQ_ORIGIN_TIME"
    --make-plot
    --plot-file "$PLOT_FILE"
    --normalization "$NORMALIZATION"
    --input-unit-factor "$INPUT_UNIT_FACTOR"
    --display-unit "$DISPLAY_UNIT"
    --station-spacing "$STATION_SPACING"
    --waveform-half-height "$WAVEFORM_HALF_HEIGHT"
    --station-order "$STATION_ORDER"
    --station-label-size "$STATION_LABEL_SIZE"
    --vr-font-size "$VR_FONT_SIZE"
    --az-font-size "$AZ_FONT_SIZE"
    --dist-font-size "$DIST_FONT_SIZE"
    --metadata-label-size "$METADATA_LABEL_SIZE"
    --legend-loc "$LEGEND_LOC"
    --stations-per-page "$STATIONS_PER_PAGE"
    --y-axis-label "$Y_AXIS_LABEL"
    --components "$COMPONENTS_TO_PLOT"
    --component-title-size "$COMPONENT_TITLE_SIZE"
    --axis-label-size "$AXIS_LABEL_SIZE"
    --tick-label-size "$TICK_LABEL_SIZE"
    --legend-font-size "$LEGEND_FONT_SIZE"
    --footer-font-size "$FOOTER_FONT_SIZE"
    --max-amp-font-size "$MAX_AMP_FONT_SIZE"
    --max-amp-decimals "$MAX_AMP_DECIMALS"
    --max-amp-x "$MAX_AMP_X"
    --max-amp-y-offset "$MAX_AMP_Y_OFFSET"
    --station-name-x "$STATION_NAME_X"
    --vr-x "$VR_X"
    --vr-y-offset "$VR_Y_OFFSET"
    --station-name-y-offset "$STATION_NAME_Y_OFFSET"
    --az-x "$AZ_X"
    --az-y-offset "$AZ_Y_OFFSET"
    --dist-x "$DIST_X"
    --dist-y-offset "$DIST_Y_OFFSET"
)

if [[ "$APPLY_TTSHIFT" == "1" ]]; then
    COMMON_ARGS+=(--apply-ttshift)
else
    COMMON_ARGS+=(--no-apply-ttshift)
fi
if [[ "$MAKE_CORRELATION_ANALYSIS" == "1" ]]; then
    COMMON_ARGS+=(--make-correlation-analysis)
else
    COMMON_ARGS+=(--no-make-correlation-analysis)
fi

if [[ -n "$TIME_MIN" ]]; then
    COMMON_ARGS+=(--time-min "$TIME_MIN")
fi
if [[ -n "$TIME_MAX" ]]; then
    COMMON_ARGS+=(--time-max "$TIME_MAX")
fi
if [[ "$ANNOTATE_STATION_ABSMAX" == "1" ]]; then
    COMMON_ARGS+=(--annotate-station-absmax)
fi
if [[ "$SHOW_FOOTER" == "1" ]]; then
    COMMON_ARGS+=(--footer)
else
    COMMON_ARGS+=(--no-footer)
fi
if [[ -n "$INCLUDE_STATIONS" ]]; then
    COMMON_ARGS+=(--include-stations "$INCLUDE_STATIONS")
fi
if [[ -n "$EXCLUDE_STATIONS" ]]; then
    COMMON_ARGS+=(--exclude-stations "$EXCLUDE_STATIONS")
fi
if [[ -n "$STATION_FILE" ]]; then
    COMMON_ARGS+=(--station-file "$STATION_FILE")
fi
if [[ -n "$MIN_DISTANCE_KM" ]]; then
    COMMON_ARGS+=(--min-distance-km "$MIN_DISTANCE_KM")
fi
if [[ -n "$MAX_DISTANCE_KM" ]]; then
    COMMON_ARGS+=(--max-distance-km "$MAX_DISTANCE_KM")
fi
if [[ -n "$MIN_AZIMUTH_DEG" ]]; then
    COMMON_ARGS+=(--min-azimuth-deg "$MIN_AZIMUTH_DEG")
fi
if [[ -n "$MAX_AZIMUTH_DEG" ]]; then
    COMMON_ARGS+=(--max-azimuth-deg "$MAX_AZIMUTH_DEG")
fi

if [[ ! -f "$PLOT_SCRIPT" ]]; then
    echo "ERROR: plotting script does not exist: $PLOT_SCRIPT" >&2
    exit 1
fi

if [[ ! -d "$DATA_DIR" ]]; then
    echo "ERROR: waveform data directory does not exist: $DATA_DIR" >&2
    exit 1
fi

echo "# Running three-component waveform reader/plotter"
echo "# Python:   $PYTHON_CMD"
echo "# Script:   $PLOT_SCRIPT"
echo "# Data dir: $DATA_DIR"
echo "# REG_INV_OUT: $REG_INV_OUT"
echo "# VR decimals: $VR_DECIMALS"
echo "# ttshift decimals: $TTSHIFT_DECIMALS"
echo "# NOTE: synthetic waveforms were already shifted by ttshift in the inversion code"
echo "# Apply ttshift to observed plotting time: $APPLY_TTSHIFT (default 0)"
echo "# ttshift sign: $TTSHIFT_SIGN"
echo "# Correlation analysis: $MAKE_CORRELATION_ANALYSIS"
echo "# CC max lag: $CC_MAX_LAG_S s"
echo "# CC minimum correlation: $CC_MIN_CORRELATION"
echo "# CC minimum VR improvement: $CC_MIN_VR_IMPROVEMENT percentage points"
echo "# Correlation CSV: $CC_OUTPUT_CSV"
echo "# ttshift update file: $TTSHIFT_UPDATE_FILE"
echo "# Quantity: $QUANTITY"
echo "# EQ origin time: $EQ_ORIGIN_TIME"
echo "# Plot file: $PLOT_FILE"
echo "# Normalization: $NORMALIZATION"
echo "# Input unit factor: $INPUT_UNIT_FACTOR"
echo "# Amplitude display unit: $DISPLAY_UNIT"
echo "# Station order: $STATION_ORDER"
echo "# Time window: ${TIME_MIN:-data start} to ${TIME_MAX:-data end} s"
echo "# Stations per page: $STATIONS_PER_PAGE"
echo "# Annotate station absmax: $ANNOTATE_STATION_ABSMAX"
echo "# Show footer: $SHOW_FOOTER"
echo "# Components: $COMPONENTS_TO_PLOT"
echo "# Font sizes: station=$STATION_LABEL_SIZE vr=$VR_FONT_SIZE az=$AZ_FONT_SIZE dist=$DIST_FONT_SIZE"
echo "# Font sizes: component=$COMPONENT_TITLE_SIZE metadata=$METADATA_LABEL_SIZE"
echo "# Font sizes: axis=$AXIS_LABEL_SIZE ticks=$TICK_LABEL_SIZE legend=$LEGEND_FONT_SIZE footer=$FOOTER_FONT_SIZE max_amp=$MAX_AMP_FONT_SIZE"
echo "# Max. amp.: decimals=$MAX_AMP_DECIMALS x=$MAX_AMP_X y_offset=$MAX_AMP_Y_OFFSET"
echo "# Station label: x=$STATION_NAME_X y_offset=$STATION_NAME_Y_OFFSET"
echo "# Vertical metadata: AZ=($AZ_X,$AZ_Y_OFFSET) DIST=($DIST_X,$DIST_Y_OFFSET)"
echo "# Include stations: ${INCLUDE_STATIONS:-all}"
echo "# Exclude stations: ${EXCLUDE_STATIONS:-none}"
echo "# Station file: ${STATION_FILE:-none}"
echo "# Distance range: ${MIN_DISTANCE_KM:-none} to ${MAX_DISTANCE_KM:-none} km"
echo "# Azimuth range: ${MIN_AZIMUTH_DEG:-none} to ${MAX_AZIMUTH_DEG:-none} deg"

"$PYTHON_CMD" "$PLOT_SCRIPT" "${COMMON_ARGS[@]}"
