#!/usr/bin/env bash
set -o errexit -o pipefail -o posix

# Copyright (c) 2019-2024 Cosmin Truta.
#
# Use, modification and distribution are subject to the MIT License.
# Please see the accompanying file LICENSE_MIT.txt
#
# SPDX-License-Identifier: MIT

# shellcheck source="ci/lib/ci.lib.sh"
source "$(dirname "$0")/lib/ci.lib.sh"
cd "$CI_TOPLEVEL_DIR"

function ci_init_shellify {
    [[ -f $CI_SCRIPT_DIR/ci_shellify.sh ]] || {
        ci_err_internal "missing script: '$CI_SCRIPT_DIR/ci_shellify.sh'"
    }
}

function ci_run_shellify {
    ci_info "shellifying:" "$@"
    local my_result
    "$BASH" "$CI_SCRIPT_DIR/ci_shellify.sh" "$@"
    echo "$my_result" | "$BASH" --posix || ci_err "bad shellify output"
    echo "$my_result"
}

function ci_verify_version {
    ci_info "## START OF VERIFICATION ##"
    local my_env_libpng_ver my_env_autoconf_ver my_env_cmake_ver my_expect
    ci_init_shellify
    my_env_libpng_ver="$(ci_run_shellify png.h)"
    echo "$my_env_libpng_ver"
    my_env_autoconf_ver="$(ci_run_shellify configure.ac)"
    echo "$my_env_autoconf_ver"
    my_env_cmake_ver="$(ci_run_shellify CMakeLists.txt)"
    echo "$my_env_cmake_ver"
    ci_info "## VERIFYING: png.h version definitions ##"
    eval "$my_env_libpng_ver"
    local my_expect="${PNG_LIBPNG_VER_MAJOR}.${PNG_LIBPNG_VER_MINOR}.${PNG_LIBPNG_VER_RELEASE}"
    if [[ "$PNG_LIBPNG_VER_STRING" == "$my_expect"* ]]
    then
        ci_info "matched: \$PNG_LIBPNG_VER_STRING == $my_expect*"
    else
        ci_err "mismatched: \$PNG_LIBPNG_VER_STRING != $my_expect*"
    fi
    my_expect=$((PNG_LIBPNG_VER_MAJOR*10000 + PNG_LIBPNG_VER_MINOR*100 + PNG_LIBPNG_VER_RELEASE))
    if [[ "$PNG_LIBPNG_VER" == "$my_expect" ]]
    then
        ci_info "matched: \$PNG_LIBPNG_VER == $my_expect"
    else
        ci_err "mismatched: \$PNG_LIBPNG_VER != $my_expect"
    fi
    my_expect=$((PNG_LIBPNG_VER_MAJOR*10 + PNG_LIBPNG_VER_MINOR))
    if [[ "$PNG_LIBPNG_VER_SHAREDLIB" == "$my_expect" ]]
    then
        ci_info "matched: \$PNG_LIBPNG_VER_SHAREDLIB == $my_expect"
    else
        ci_err "mismatched: \$PNG_LIBPNG_VER_SHAREDLIB != $my_expect"
    fi
    if [[ "$PNG_LIBPNG_VER_SONUM" == "$my_expect" ]]
    then
        ci_info "matched: \$PNG_LIBPNG_VER_SONUM == $my_expect"
    else
        ci_err "mismatched: \$PNG_LIBPNG_VER_SONUM != $my_expect"
    fi
    if [[ "$PNG_LIBPNG_VER_DLLNUM" == "$my_expect" ]]
    then
        ci_info "matched: \$PNG_LIBPNG_VER_DLLNUM == $my_expect"
    else
        ci_err "mismatched: \$PNG_LIBPNG_VER_DLLNUM != $my_expect"
    fi
    if [[ "$PNG_LIBPNG_VER_BUILD" == 1 ]]
    then
        ci_info "matched: \$PNG_LIBPNG_VER_BUILD == 1"
    else
        ci_err "mismatched: \$PNG_LIBPNG_VER_BUILD != 1"
    fi
    ci_info "## VERIFYING: png.h build definitions ##"
    my_expect="${PNG_LIBPNG_VER_MAJOR}.${PNG_LIBPNG_VER_MINOR}.${PNG_LIBPNG_VER_RELEASE}"
    if [[ "$PNG_LIBPNG_VER_STRING" == "$my_expect" ]]
    then
        if [[ $PNG_LIBPNG_BUILD_BASE_TYPE -eq $PNG_LIBPNG_BUILD_STABLE ]]
        then
            ci_info "matched: \$PNG_LIBPNG_BUILD_BASE_TYPE -eq \$PNG_LIBPNG_BUILD_BETA"
        else
            ci_err "mismatched: \$PNG_LIBPNG_BUILD_BASE_TYPE -ne \$PNG_LIBPNG_BUILD_BETA"
        fi
    elif [[ "$PNG_LIBPNG_VER_STRING" == "$my_expect".git ]]
    then
        if [[ $PNG_LIBPNG_BUILD_BASE_TYPE -eq $PNG_LIBPNG_BUILD_BETA ]]
        then
            ci_info "matched: \$PNG_LIBPNG_BUILD_BASE_TYPE -eq \$PNG_LIBPNG_BUILD_BETA"
        else
            ci_err "mismatched: \$PNG_LIBPNG_BUILD_BASE_TYPE -ne \$PNG_LIBPNG_BUILD_BETA"
        fi
    else
        ci_err "unexpected: \$PNG_LIBPNG_VER_STRING == '$PNG_LIBPNG_VER_STRING'"
    fi
    ci_info "## VERIFYING: png.h type definitions ##"
    my_expect="$(echo "png_libpng_version_${PNG_LIBPNG_VER_STRING}" | tr . _)"
    ci_spawn grep -w -e "$my_expect" png.h
    ci_info "## VERIFYING: configure.ac version definitions ##"
    eval "$my_env_autoconf_ver"
    if [[ "$PNGLIB_VERSION" == "$PNG_LIBPNG_VER_STRING" ]]
    then
        ci_info "matched: \$PNGLIB_VERSION == \$PNG_LIBPNG_VER_STRING"
    else
        ci_err "mismatched: \$PNGLIB_VERSION != \$PNG_LIBPNG_VER_STRING"
    fi
    ci_info "## VERIFYING: CMakeLists.txt version definitions ##"
    eval "$my_env_cmake_ver"
    if [[ "$PNGLIB_VERSION" == "$PNG_LIBPNG_VER_STRING" && "$PNGLIB_SUBREVISION" == 0 ]]
    then
        ci_info "matched: \$PNGLIB_VERSION == \$PNG_LIBPNG_VER_STRING"
        ci_info "matched: \$PNGLIB_SUBREVISION == 0"
    elif [[ "$PNGLIB_VERSION.$PNGLIB_SUBREVISION" == "$PNG_LIBPNG_VER_STRING" ]]
    then
        ci_info "matched: \$PNGLIB_VERSION.\$PNGLIB_SUBREVISION == \$PNG_LIBPNG_VER_STRING"
    else
        ci_err "mismatched: \$PNGLIB_VERSION != \$PNG_LIBPNG_VER_STRING"
    fi
    ci_info "## END OF VERIFICATION ##"
    ci_info "success!"
}

function usage {
    echo "usage: $CI_SCRIPT_NAME [<options>]"
    echo "options: -?|-h|--help"
    exit "${@:-0}"
}

function main {
    local opt
    while getopts ":" opt
    do
        # This ain't a while-loop. It only pretends to be.
        [[ $1 == -[?h]* || $1 == --help || $1 == --help=* ]] && usage 0
        ci_err "unknown option: '$1'"
    done
    shift $((OPTIND - 1))
    [[ $# -eq 0 ]] || {
        echo >&2 "error: unexpected argument: '$1'"
        usage 2
    }
    # And... go!
    ci_verify_version
}

main "$@"
