#!/usr/bin/env bash
# ============================================================================
#  run_rcms.sh  -  Diem vao he thong chay lai cac mo hinh RCM (clWRF + RegCM)
#                  cho bai toan Du bao mua nghiep vu (Seasonal_FC / CFSv2).
#
#  ==================  TOM TAT NHANH (hay dung nhat)  ======================
#     ./run_rcms.sh 2026 09 01                  # KIEM TRA + in ke hoach (KHONG chay)
#     ./run_rcms.sh --execute 2026 09 01        # CHAY that ca 3 giai doan
#     ./run_rcms.sh --execute --model clwrf 2026 09 01   # chi 1 mo hinh (clwrf|regcm)
#     ./run_rcms.sh --execute --resume 2026 09 01        # tiep tuc khi job bi chet
#     ./manual_download.sh -n 2026090100        # kiem tra data CFS TRUOC khi chay
#     ./run_rcms.sh -h                          # tro giup day du
#  ========================================================================
#
#  Cach dung:
#     ./run_rcms.sh [--execute] [--model clwrf|regcm|both] [--no-monthly] \
#                   [--resume] YEAR MONTH DAY [HOUR]
#
#  Mac dinh (khong --execute) chi KIEM TRA du lieu va IN KE HOACH, khong chay.
#  Them --execute de thuc su chay.  Them --no-monthly de bo qua GD3.
#  --resume: khi wdir/<ngay> ton tai nhung tich phan CHUA hoan tat va ban da
#            xac nhan KHONG con job chay (squeue trong), nop lai buoc tich phan
#            (giu nguyen WPS/IC-BC da co, khong xoa wdir).
#
#  Chay TUAN TU 3 giai doan, moi giai doan idempotent (xong roi -> BO QUA):
#     GD1 Tich phan  -> GD2 Hau xu ly -> GD3 Dong goi thang/ngay (NCCB_562)
#  Chi tiet trang thai tung mo hinh cho MOT ngay:
#     - Da co ket qua hau xu ly (GD2)      -> BO QUA GD1+GD2.
#     - Da tich phan (GD1) nhung chua GD2  -> chi chay hau xu ly.
#     - Chua chay                          -> chay ca tich phan (GD1) + hau xu ly (GD2).
#     - wdir/<ngay> dang ton tai (job song)-> khong nop lai.
#  GD3: neu da co du file thang/ngay (mem theo ngay) -> BO QUA; can GD2 xong
#       ca clWRF va RegCM truoc khi chay.
#  (Bo qua buoc XOA ket qua sau tich phan / truoc hau xu ly - theo yeu cau.)
#
#  Cau hinh: config/rcms.conf (ghi de bang bien moi truong khi can).
#  Sau khi build xong co the copy toan bo thu muc nay sang user nampq va chay.
# ============================================================================

set -Eeuo pipefail

RCMS_HOME="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
export RCMS_HOME

# shellcheck source=lib/common.sh
source "$RCMS_HOME/lib/common.sh"
# shellcheck source=lib/clwrf.sh
source "$RCMS_HOME/lib/clwrf.sh"
# shellcheck source=lib/regcm.sh
source "$RCMS_HOME/lib/regcm.sh"
# shellcheck source=lib/monthly.sh
source "$RCMS_HOME/lib/monthly.sh"

usage() {
    sed -n '2,38p' "${BASH_SOURCE[0]}" | sed 's/^#\{0,1\} \{0,1\}//'
}

# ---- Cac subcommand noi bo (goi boi job SLURM) ----------------------------
# Khong hien trong usage; dung de job SLURM goi lai vao module tuong ung.
case "${1:-}" in
    _integrate_clwrf) load_config; clwrf_integrate   "$2" "$3"; exit 0 ;;
    _post_clwrf)      load_config; clwrf_postprocess "$2" "$3"; exit 0 ;;
    _icbc_regcm)      load_config; regcm_run_icbc    "$2" "$3"; exit 0 ;;
    _integrate_regcm) load_config; regcm_integrate   "$2" "$3"; exit 0 ;;
    _post_regcm)      load_config; regcm_postprocess "$2";      exit 0 ;;
esac

# ---- Phan tich tham so nguoi dung -----------------------------------------
execute=0
model=both
monthly=1
resume=0
while (($#)); do
    case "$1" in
        --execute)    execute=1; shift ;;
        --model)      (($# >= 2)) || die "--model can 1 gia tri"; model=$2; shift 2 ;;
        --no-monthly) monthly=0; shift ;;
        --resume)     resume=1; shift ;;
        -h|--help)    usage; exit 0 ;;
        --) shift; break ;;
        -*) die "tuy chon khong biet: $1" ;;
        *) break ;;
    esac
done
(($# == 3 || $# == 4)) || { usage >&2; exit 2; }
case "$model" in clwrf|regcm|both) ;; *) die "--model phai la clwrf|regcm|both" ;; esac

load_config

ymdh=$(normalize_cycle "$@")
ymd=${ymdh:0:8}

resolve_cycle_dates "$ymd" || die "khong xac dinh duoc chu ky tu $INPUT_DIR/$ymd"
S_DATE=$CYCLE_S_DATE
E_DATE=$CYCLE_E_DATE
[[ $S_DATE == "$ymdh" ]] || die "INIT tu file ($S_DATE) khac chu ky yeu cau ($ymdh)"

validate_cycle_files "$S_DATE" "$E_DATE" || die "du lieu dau vao chua day du cho $S_DATE"

log "================ RCM run ================"
log "  chu ky yeu cau : $ymdh UTC"
log "  khoang tich phan: $S_DATE -> $E_DATE"
log "  du lieu dau vao : $INPUT_DIR/$ymd"
log "  clWRF dir       : $CLWRF_DIR"
log "  RegCM dir       : $REGCM_DIR"
log "  che do          : $([[ $execute == 1 ]] && echo EXECUTE || echo 'PLAN (them --execute de chay)')"
log "  GD3 dong goi     : $([[ $monthly == 1 ]] && echo "co ($FORECAST_DIR)" || echo 'bo qua (--no-monthly)')"
((resume)) && log "  --resume        : nop lai tich phan neu wdir ton tai nhung chua hoan tat (da xac nhan khong con job chay)"
log "========================================"

# --- GD1 + GD2 (tich phan + hau xu ly) theo tung mo hinh ---
if [[ $model == clwrf || $model == both ]]; then
    clwrf_process "$S_DATE" "$E_DATE" "$execute" "$resume"
fi
if [[ $model == regcm || $model == both ]]; then
    regcm_process "$S_DATE" "$E_DATE" "$execute" "$resume"
fi

# --- GD3 dong goi thang/ngay (chi khi chay ca hai mo hinh) ---
if ((monthly)); then
    if [[ $model == both ]]; then
        monthly_process "$S_DATE" "$execute"
    else
        log "GD3: chi chay khi --model both (dong goi can ca clWRF va RegCM) -> bo qua"
    fi
fi

((execute)) || log "PLAN ONLY: chua chay lenh mo hinh nao. Them --execute de thuc thi."
exit 0
