#!/usr/bin/env bash

PROJECT=$1
LOG_DIR="/var/log/openSUSE-release-tools/${PROJECT}"
IBS_PRODUCT_PREFIX="SUSE:SLFO:Products:"
SLFO_MAIN_BUILD="SUSE:SLFO:Main:Build"
GITEA_PRODUCTS_URL="gitea@src.suse.de:products/"
[ ! -d "${LOG_DIR}" ] && mkdir ${LOG_DIR}


ibs_to_gitea_product() {
    printf '%s' "${GITEA_PRODUCTS_URL}$(printf '%s' "${PROJECT}" | sed "s/${IBS_PRODUCT_PREFIX}//" | sed -E 's/:/\#/g')"
}


pkglistgen_extra_args() {
    if [[ ${PROJECT} =~ ^${IBS_PRODUCT_PREFIX}.* ]] ; then
        printf '%s' "--engine product_composer --git-url $(ibs_to_gitea_product)"
    else
        printf ''
    fi
}

logger() {
    date -Is >> ${LOG_DIR}/pkglistgen.log
    echo "$1" >> ${LOG_DIR}/pkglistgen.log
}

polling_project_repo() {
    local build_system_project="$1"
    local build_system_repo="$2"
    logger "[CHECKING] Checking ${build_system_repo} repository from ${build_system_project}"
    OUTPUT=$(timeout 3m /usr/share/openSUSE-release-tools/verify-repo-built-successful.py -A ${API_URL} -p ${build_system_project} -r ${build_system_repo} 2>&1)
    RETURNCODE=$?
    if [ ${RETURNCODE} -eq 0 ]; then
        logger "[READY] Repository is NOT building"
    elif [ ${RETURNCODE} -eq 124 ]; then
        logger "[TIMEOUT] Verifying repository status reaches a timeout"
    else
        case ${OUTPUT} in
            *"Repository "*" is not yet finished"*)
                logger "[BUILDING] Repository is building"
                RETURNCODE=3
                ;;
            *"Repository "*" has "*" packages"*)
                logger "[FAILED] Repository has package build failed"
                RETURNCODE=4
                ;;
            *"Repository "*" has more disabled packages than succeeded"*)
                logger "[ERROR] Repository has more disabled packages than succeeded"
                RETURNCODE=5
                ;;
        esac
        logger "${OUTPUT}"
    fi
    return ${RETURNCODE}
}

polling_repo() {
    if [[ ${PROJECT} =~ ^${IBS_PRODUCT_PREFIX}.* ]] ; then
        polling_project_repo ${SLFO_MAIN_BUILD} standard
    fi
    polling_project_repo ${PROJECT} standard
}

logger "[START] Start osrt-pkglistgen@${PROJECT}.service: polling repository results"
polling_repo
# Check if repository building
if [ $? -eq 3 ]; then
    # Repository is building, waiting it finishes
    while true; do
        logger "[WAITING] Waiting 10min before next repository status check"
        sleep 10m
        polling_repo
        case $? in
            0)
                # Stop polling repository results: Repository finished building
                if systemctl is-active --quiet osrt-relpkggen@${PROJECT}.service; then
                    logger "[WARNING] osrt-relpkggen@${PROJECT}.service is running"
                    logger "[WAITING] Waiting for osrt-relpkggen@${PROJECT}.service finishes"
                    continue
                else
                    logger"[RUNNING] Running osrt-pkglistgen"
                    /usr/bin/osrt-pkglistgen -A ${API_URL} --debug update_and_solve -p ${PROJECT} -s target --custom-cache-tag product $(pkglistgen_extra_args) --force >> ${LOG_DIR}/pkglistgen.log 2>&1
                    exit $?
                fi
                ;;
            3)
                # Continue polling repository results: Repository is still building
                continue
                ;;
            124)
                # Retry polling repository results: Verifying repository results reaches a timeout
                continue
                ;;
            *)
                # Stop polling repository results: Failed polling results
                exit 1
                ;;
        esac
    done
fi
logger "[FINISH] Finish osrt-pkglistgen@${PROJECT}.service"
