#!/bin/bash
#set -x
readonly INPUT_DATE="$1"
readonly INPUT_HOUR="$2"
readonly INPUT_END_COUNT="$3"
readonly PROGNAME="$(basename $0)"

readonly INPUT_DATE_NEW=$(date +%Y%m%d)

readonly SRC_BASE_URL="https://data.ecmwf.int/forecasts"
readonly ARMOS_PATH="${INPUT_DATE_NEW}/${INPUT_HOUR}z/ifs/0p25/oper"
readonly SAVE_PATH="/data/public/Goldwind/ec/"
readonly RETRYS=10
readonly CHECK_FILE_SIZE="104857600"

download(){
    local src_path="$1"
    local dst_path="$2"
    local dst_file="$3"
    
    echo "download $src_path starting..."
    wget --no-check-certificate -q -c -O "${dst_path}/${dst_file}" "${src_path}"
}

download_ecmwf_grib(){
    local step="$1"
    local dst_path="$2"
    local src_file_name="${INPUT_DATE_NEW}${INPUT_HOUR}0000-${step}h-oper-fc.grib2"
    local src_file_url="${SRC_BASE_URL}/${ARMOS_PATH}/${src_file_name}"
    local dst_file_path="${dst_path}/${src_file_name}"
    
    if [[ ! -f "${dst_file_path}" ]]
    then
        download "${src_file_url}" "${dst_path}" "${src_file_name}"
    fi
    for i in $(seq ${RETRYS})
    do 
        fs=$(stat -c %s "${dst_file_path}")
        if [[ ${fs} -lt ${CHECK_FILE_SIZE} ]]
        then
            sleep 60
            echo "retry $i download ${src_file_url}"
            download "${src_file_url}" "${dst_path}" "${src_file_name}"
        else
            break
        fi
    done
}

download_ecmwf_gribs(){
    local ymd="$1"
    local hour="$2"
    local dst_path="${SAVE_PATH}/${ARMOS_PATH}"
    [[ -d "${dst_path}" ]] || mkdir -pv "${dst_path}"

    STEPS_3H=$(seq 0 3 144)
    STEPS_6H=$(seq 150 6 ${INPUT_END_COUNT})
    ALL_STEPS="${STEPS_3H} ${STEPS_6H}"

    for t in ${ALL_STEPS}
    do
       download_ecmwf_grib "${t}" "${dst_path}"
    done 
}

check_download_status(){
    local hour="$1"
    local dst_path="${SAVE_PATH}/${ARMOS_PATH}"
    local status_code=0

    STEPS_3H=$(seq 0 3 144)
    STEPS_6H=$(seq 150 6 ${INPUT_END_COUNT})
    ALL_STEPS="${STEPS_3H} ${STEPS_6H}"

    for t in ${ALL_STEPS}
    do
        file_name="${INPUT_DATE_NEW}${INPUT_HOUR}0000-${t}h-oper-fc.grib2"
        dst_file="${dst_path}/${file_name}"
        if [[ ! -f "${dst_file}" ]]
        then
            let status_code++
        fi
        fs=$(stat -c %s "${dst_file}")
        if [[ ${fs} -lt ${CHECK_FILE_SIZE} ]]
        then
            let status_code++
        fi
    done
    echo ${status_code}
}

main(){
    if [[ -n "${INPUT_DATE}" && -n "${INPUT_HOUR}" && -n "${INPUT_END_COUNT}" ]]
    then
        download_ecmwf_gribs "${INPUT_DATE_NEW}" "${INPUT_HOUR}"
        status=$(check_download_status "${INPUT_HOUR}")
        exit ${status}
    else
        echo "Missing input parameters!"
        echo "Usage: ${PROGNAME} YYYYMMDD HH MAX_LEAD_HOUR"
        echo "Example: ${PROGNAME} 20260727 00 360"
        exit 1
    fi
}

main
