#!/usr/bin/bash
#shellcheck disable=SC1090

. "$(sfpath)" || exit 3

shellfu import pretty

usage() {
    mkusage "$@" \
        '[options] SRC_DIR' \
        -o                                                      \
        '-c COPR_CLI_BIN    use alternative copr-cli binary'    \
        '-r                 remove SRPM right after submission' \
        '-w                 wait for build to finish'           \
        ''                                                      \
        'SRC_DIR must contain sub-directory _mkittool with'     \
        'file "pokecopr.map" containing mappings of SRPM names' \
        'to COPR projects.   The file must consist of lines in' \
        'following format:'                                     \
        ''                                                      \
        '    PROJECT SRPMNAME'                                  \
        ''                                                      \
        'where PROJECT is name of COPR project an SRPMNAME is'  \
        'name of SRPM that can be uploaded there.'
}

find_srpms() {
    #
    # Find SRPM's by internal name $1
    #
    local name=$1
    local path
    find "$SrcDir" -name '*.src.rpm' \
      | while read -r path; do
            rpm --qf '%{NAME}\n' -qp "$path" | grep -qxF "$name" || continue
            echo "$path"
        done \
      | grep .
}

do_projects() {
    local projname
    local srpmname
    local srpmfile
    local bldid
    grep -v '^[[:blank:]]*#' "$ProjectMap" \
      | grep . \
      | while read -r projname srpmname; do
            think "projname='$projname'"
            think "srpmname='$srpmname'"
            srpmfile=$(
                find_srpms "$srpmname" \
                  | sort -V \
                  | tail -1
            )
            test -n "$srpmfile" || {
                warn "no SRPM found: $srpmname for $projname in $SrcDir"
                continue
            }
            bldid=$(
                "$CoprCli" build --nowait "$projname" "$srpmfile" \
                  | grep -E '^Created builds: [0-9]+$' \
                  | cut -d' ' -f3
            )
            warn "bldid='$bldid'"
            test -n "$bldid" || {
                warn "build submission failed: ${srpmfile##*/} for $projname in $SrcDir"
                continue
            }
            $Rm   && rm "$srpmfile"
            $Wait && "$CoprCli" watch-build "$bldid"
        done
    if $Wait; then printf '\a'; fi
}

main() {
    local SrcDir            # where to look for SRPM and .poke_copr
    local ProjectMap       # _mkittool/pokecopr.paterns or _poke_copr
    local Wait=false        # wait for copr-cli?
    local CoprCli=copr-cli  # copr-cli command
    local Rm=false      # remove SRPM after submitting
    while true; do case $1 in
        -c) CoprCli=$2; shift 2 || usage -w "no COPR_CLI_BIN?" ;;
        -r) Rm=true; shift ;;
        -w) Wait=true; shift ;;
        -*) usage -w "unknown argument: $1" ;;
        *)  break ;;
    esac done
    SrcDir=${1:-.}
    test -n "$SrcDir" \
     || usage -w "no SRC_DIR?"
    test -d "$SrcDir" \
     || die "no such directory: $SrcDir"
    ProjectMap="$SrcDir/_mkittool/pokecopr.map"
    test -r "$ProjectMap" \
     || die "could not read project map file: $ProjectMap (see --help)"
    think "CoprCli='$CoprCli'"
    do_projects
}

main "$@"
