#!/usr/bin/env bash
# Copyright (C) 2023 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

. resources/scripts/misc/sysexits.sh

topdir="$(realpath "$(dirname "$(dirname "$(dirname "$(dirname "$0")")")")")"

progname="resources/packages/tests/test-release"
rev="$("${topdir}"/resources/git/git describe --tags HEAD)"

usage()
{
    progname="$1"

    printf "Usage: %s [options]\n\n" "${progname}"
    printf "Available options:\n"
    printf "\t-h, --help\n"
    printf "\t\tDisplay this help and exit.\n"
}

test_file()
{
    path="$1"

    test -f "${path}" ; ret=$?

    if [ ${ret} -eq 0 ] ; then
        echo "[ OK ] ${path}"
    else
        echo "[ !! ] ${path} is missing"
        exit ${ret}
    fi
}

test_qemu_rom_archive()
{
    target="qemu-pc_2mb"
    dir="release"

    keyboard_layouts=" \
        colemak \
        deqwertz \
        esqwerty \
        frazerty \
        frdvbepo \
        itqwerty \
        svenska \
        trqwerty \
        ukdvorak \
        ukqwerty \
        usdvorak \
        usqwerty \
    "

    archive_files=""
    for kb in ${keyboard_layouts} ; do
        cbfb="corebootfb"
        txtmode="txtmode"

        archive_files="${archive_files} \
            ${target}/grub_${target}_${cbfb}_${kb}.rom \
            ${target}/grub_${target}_${txtmode}_${kb}.rom \
            ${target}/seabios_${target}_${cbfb}_${kb}.rom \
            ${target}/seabios_${target}_${txtmode}_${kb}.rom \
        "
    done

    archive_files="${archive_files} qemu-pc_2mb/version"
    archive_files="${archive_files} qemu-pc_2mb/versiondate"
    archive_files="${archive_files} qemu-pc_2mb/projectname"

    archive="${dir}"/roms/gnuboot-"${rev}"_"${target}".tar.xz

    for path in $(tar tf "${archive}" | grep -v '/$') ; do
        found=0
        for archive_file in ${archive_files} ; do
            if [ "${path}" = "${archive_file}" ] ; then
                found=1
            fi
        done

        if [ $found -eq 0 ] ; then
            echo "[ !! ] $path"
        fi
    done
}

test_release_dir()
{
    dir="release"

    targets="\
        d510mo \
        d510mo_16mb \
        d945gclf \
        d945gclf_16mb \
        g43t-am3 \
        g43t-am3_16mb \
        ga-g41m-es2l \
        kcma-d8-rdimm_16mb \
        kcma-d8-rdimm_2mb \
        kcma-d8-udimm_16mb \
        kcma-d8-udimm_2mb \
        kfsn4-dre_1mb \
        kfsn4-dre_2mb \
        kgpe-d16-rdimm_16mb \
        kgpe-d16-rdimm_2mb \
        kgpe-d16-udimm_16mb \
        kgpe-d16-udimm_2mb \
        macbook11 \
        macbook11_16mb \
        macbook21 \
        macbook21_16mb \
        qemu-pc_2mb \
        r400_16mb \
        r400_4mb \
        r400_8mb \
        r500_4mb \
        t400_16mb \
        t400_4mb \
        t400_8mb \
        t500_16mb \
        t500_4mb \
        t500_8mb \
        t60_16mb_intelgpu \
        t60_intelgpu \
        w500_16mb \
        w500_4mb \
        w500_8mb \
        x200_16mb \
        x200_4mb \
        x200_8mb \
        x301_16mb \
        x301_4mb \
        x301_8mb \
        x60 \
        x60_16mb \
    "

    release_files=""

    for target in ${targets} ; do
        archive_path="${dir}"/roms/gnuboot-"${rev}"_"${target}".tar.xz
        release_files="${release_files}"" ""${archive_path}"
    done

    release_files="${release_files}"" ""${dir}"/gnuboot-"${rev}"_src.tar.xz

    release_files="${release_files}"" ""${dir}"/gnuboot-source-"${rev}".bundle

    release_files="${release_files}"" ""${dir}"/untitled-"${rev}".bundle

    release_files="${release_files}"" ""${dir}"/gnuboot-website-"${rev}".tar.gz

    release_files="${release_files}"" ""${dir}"/i945-thinkpads-install/i945-thinkpads-install-utilities-deb-pack.deb
    release_files="${release_files}"" ""${dir}"/i945-thinkpads-install/packages_src.tar
    release_files="${release_files}"" ""${dir}"/i945-thinkpads-install/gnuboot_src.tar
    release_files="${release_files}"" ""${dir}"/i945-thinkpads-install/i945-thinkpads-install-utilities-tarball-pack.tar.gz

    for path in ${release_files} ; do
        test_file "${path}"
    done

    missing_in_release_files=0
    while IFS= read -r -d '' path ; do
        found=0
        for release_file in ${release_files} ; do
            if [ "${path}" = "${release_file}" ] ; then
                found=1
            fi
        done

        if [ $found -eq 0 ] ; then
            echo "[ !! ] $path missing in \${release_files}"
	    missing_in_release_files=$(expr $missing_in_release_files + 1)
        fi
    done < <(find "${dir}" -type f -print0)

    if [ ${missing_in_release_files} -gt 0 ] ; then
	exit 1
    fi
}

test_release()
{
    test_release_dir
    test_qemu_rom_archive
}

if [ $# -eq 1 ] && { [ "$1" = "-h" ] || [ "$1" == "--help" ] ;} ; then
    usage "${progname}"
    exit 0
elif [ $# -eq 0 ] ; then
    test_release
else
    usage "${progname}"
    exit ${EX_USAGE}
fi