# ============================================================================
#  lib/common.sh  -  Ham dung chung cho he thong chay RCMs
#
#  Duoc source boi run_rcms.sh va cac module clwrf.sh / regcm.sh.
#  KHONG tu chay truc tiep.
# ============================================================================

# ---- Logging & loi --------------------------------------------------------
log()  { printf '[%s] %s\n'   "$(date -u +%H:%M:%S)" "$*"; }
warn() { printf '[%s] WARN: %s\n' "$(date -u +%H:%M:%S)" "$*" >&2; }
die()  { printf 'ERROR: %s\n' "$*" >&2; exit 1; }

# ---- Nap cau hinh ---------------------------------------------------------
# RCMS_HOME = thu muc goc cua bo module nay (noi chua run_rcms.sh)
load_config() {
    local cfg="${RCMS_CONF:-$RCMS_HOME/config/rcms.conf}"
    [[ -r $cfg ]] || die "khong doc duoc file cau hinh: $cfg"
    # shellcheck disable=SC1090
    source "$cfg"
    : "${WORK_DIR:?}" "${CLWRF_DIR:?}" "${REGCM_DIR:?}" "${INPUT_DIR:?}" \
      "${CURRENT_ROOT:?}" "${CONFIGURE_WRF:?}" "${CONFIGURE_REGCM:?}" \
      "${FORECAST_DIR:?}" "${MONTHLY_SCRIPT:?}"
}

# ---- Chuan hoa & kiem tra ngay --------------------------------------------
# normalize_cycle YEAR MONTH DAY [HOUR] -> in ra "YYYYMMDDHH", exit neu sai
normalize_cycle() {
    local year=$1 month=$2 day=$3 hour=${4:-00}
    [[ $year  =~ ^[0-9]{4}$   ]] || die "YEAR phai co 4 chu so"
    [[ $month =~ ^[0-9]{1,2}$ ]] || die "MONTH phai la 1-2 chu so"
    [[ $day   =~ ^[0-9]{1,2}$ ]] || die "DAY phai la 1-2 chu so"
    [[ $hour  =~ ^[0-9]{1,2}$ ]] || die "HOUR phai la 1-2 chu so"
    printf -v month '%02d' "$((10#$month))"
    printf -v day   '%02d' "$((10#$day))"
    printf -v hour  '%02d' "$((10#$hour))"
    local ymdh="${year}${month}${day}${hour}"
    local norm
    norm=$(date -u -d "${year}-${month}-${day} ${hour}:00:00" +%Y%m%d%H 2>/dev/null) \
        || die "ngay UTC khong hop le: ${year}-${month}-${day} ${hour}:00"
    [[ $norm == "$ymdh" ]] || die "ngay UTC khong hop le: ${year}-${month}-${day} ${hour}:00"
    printf '%s\n' "$ymdh"
}

# ---- Cong 6 gio (dung ndate.exe neu co, neu khong dung date) --------------
add6() {
    local t=$1
    if command -v ndate.exe >/dev/null 2>&1; then
        ndate.exe +6 "$t"
    else
        date -u -d "${t:0:4}-${t:4:2}-${t:6:2} ${t:8:2}:00 UTC 6 hours" +%Y%m%d%H
    fi
}

# ---- Xac dinh S_DATE / E_DATE cho mot chu ky tu cac file GRIB2 -------------
# Dat bien toan cuc: CYCLE_S_DATE, CYCLE_E_DATE
# Tra ve 1 neu thu muc chu ky khong ton tai / khong co file.
resolve_cycle_dates() {
    local ymd=$1
    local cdir="$INPUT_DIR/$ymd"
    [[ -d $cdir ]] || { warn "khong co thu muc chu ky: $cdir"; return 1; }
    local first last
    first=$(ls "$cdir"/flxf*.grb2 2>/dev/null | sort | head -1)
    last=$( ls "$cdir"/flxf*.grb2 2>/dev/null | sort | tail -1)
    [[ -n $first && -n $last ]] || { warn "khong co file flxf trong $cdir"; return 1; }
    # ten: flxf<VALID>.<mem>.<INIT>.grb2  -> S_DATE = INIT ; E_DATE = VALID cuoi
    local fn=${first##*/} ln=${last##*/}
    CYCLE_S_DATE=$(echo "$fn" | cut -d. -f3)
    CYCLE_E_DATE=$(echo "$ln" | cut -d. -f1 | sed 's/flxf//')
    [[ $CYCLE_S_DATE =~ ^[0-9]{10}$ && $CYCLE_E_DATE =~ ^[0-9]{10}$ ]] \
        || { warn "khong doc duoc S_DATE/E_DATE tu ten file: $fn / $ln"; return 1; }
    return 0
}

# ---- Kiem tra tinh day du & lien tuc (6h) cua cap flxf/pgbf ----------------
# validate_cycle_files S_DATE E_DATE  (dung $INPUT_DIR/<ymd>)
validate_cycle_files() {
    local s=$1 e=$2
    local cdir="$INPUT_DIR/${s:0:8}"
    local t=$s n=0
    while [[ $t -le $e ]]; do
        local flxf="$cdir/flxf$t.$MEMBER.$s.grb2"
        local pgbf="$cdir/pgbf$t.$MEMBER.$s.grb2"
        [[ -s $flxf ]] || { warn "thieu/rong: $flxf"; return 1; }
        [[ -s $pgbf ]] || { warn "thieu/rong: $pgbf"; return 1; }
        t=$(add6 "$t"); n=$((n+1))
    done
    log "kiem tra du lieu: $n cap flxf/pgbf lien tuc $s -> $e (OK)"
    return 0
}

# ---- Nhan biet trang thai clWRF cho mot S_DATE ----------------------------
# In ra: done | integrated | running | none
#  Luu y: tich phan co the do CHINH tool nay (du lieu o wdir2/) HOAC do he cu /
#  chay tay (du lieu con o wdir/, khong co logs rieng). Vi vay ta coi la
#  'integrated' khi tim thay wrfout HOAN CHINH (co dau 'SUCCESS COMPLETE WRF')
#  o wdir2/ HOAC wdir/, du chua duoc chuyen sang wdir2/.
clwrf_state() {
    local s=$1
    if [[ -s "$CURRENT_ROOT/CLWRF/$s/rainc.nc" ]] \
       || [[ -n $(find "$CLWRF_DIR/done/$s" -type f -name '*.nc' -print -quit 2>/dev/null) ]]; then
        echo done; return
    fi
    local d
    for d in "$CLWRF_DIR/wdir2/$s" "$CLWRF_DIR/wdir/$s"; do
        if [[ -n $(find "$d/output" -name 'wrfout_d01_*' -print -quit 2>/dev/null) ]] \
           && grep -q 'SUCCESS COMPLETE WRF' \
                  "$d/rsl.error.0000" "$d/output/rsl.error.0000" 2>/dev/null; then
            echo integrated; return
        fi
    done
    if [[ -d "$CLWRF_DIR/wdir/$s" ]]; then echo running; return; fi
    echo none
}

# ---- Nhan biet RegCM da tich phan xong (den mdate2) chua --------------------
# _regcm_run_finished S_DATE INTDIR  -> return 0 neu da hoan tat
#  Ưu tien log 'successfully reached end' (tool nay / he cu ghi test_out),
#  neu khong co log thi doc mdate2 tu namelist.in_<S> va kiem tra file restart/
#  SAV cuoi cung (=mdate2) da ton tai chua.
_regcm_run_finished() {
    local s=$1 d=$2
    grep -q 'successfully reached end' \
        "$REGCM_DIR/logs_run_$s" "$REGCM_DIR/test_out" 2>/dev/null && return 0
    local nl="$REGCM_DIR/namelist.in_$s" mend
    if [[ -r $nl ]]; then
        mend=$(grep -iE '^[[:space:]]*mdate2' "$nl" | grep -oE '[0-9]{10}' | head -1)
        if [[ -n $mend ]]; then
            [[ -s "$d/output/d01.clm.regcm.r.$mend.nc" \
               || -s "$d/output/d01_SAV.$mend.nc" ]] && return 0
            # Fallback: mo hinh co the ABORT o dung buoc BIEN CUOI (vd loi doc
            # PTOP/BC tai mdate2) sau khi da ghi DU output thang cua TAT CA cac
            # thang du bao. Coi la 'da tich phan' neu file thang CUOI CUNG (=dau
            # thang lien truoc mdate2) da co -> cho phep chay GD2 tren output day
            # du, KHONG tich phan lai (tranh crash lai + mat ca ngay). Neu chay
            # bi cat som that su, file thang cuoi nay se KHONG ton tai -> van 'running'.
            local lastmon
            lastmon=$(date -u -d "${mend:0:4}-${mend:4:2}-${mend:6:2} -1 day" +%Y%m01 2>/dev/null)00
            if [[ ${#lastmon} -eq 10 && -s "$d/output/d01_SRF.$lastmon.nc" \
                  && -s "$d/output/d01_ATM.$lastmon.nc" ]]; then
                return 0
            fi
        fi
    fi
    return 1
}

# ---- Nhan biet trang thai RegCM cho mot S_DATE ----------------------------
# In ra: done | integrated | running | none
#  Tuong tu clWRF: chap nhan ca truong hop du lieu con o wdir/ (chay boi he cu).
regcm_state() {
    local s=$1
    if [[ -s "$CURRENT_ROOT/RegCM/$s/daily/pr.nc" ]] \
       || [[ -n $(find "$REGCM_DIR/done/$s" -type f -name '*.nc' -print -quit 2>/dev/null) ]]; then
        echo done; return
    fi
    local d
    for d in "$REGCM_DIR/wdir2/$s" "$REGCM_DIR/wdir/$s"; do
        if [[ -n $(find "$d/output" -name 'd01_SRF.*.nc' -print -quit 2>/dev/null) ]] \
           && _regcm_run_finished "$s" "$d"; then
            echo integrated; return
        fi
    done
    if [[ -d "$REGCM_DIR/wdir/$s" ]]; then echo running; return; fi
    echo none
}
