#!/bin/sh
#
# Copyright (C) 2023  Etersoft
# Copyright (C) 2023  Vitaly Lipatov <lav@etersoft.ru>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

load_helper epm-sh-altlinux
load_helper epm-assure
load_helper epm-repack

[ -n "$EPM_PACK_SCRIPTS_DIR" ] || EPM_PACK_SCRIPTS_DIR="$CONFIGDIR/pack.d"


__epm_pack()
{
    local packname="$1"
    local tarname="$2"
    returntarname=''

    local repackcode="$EPM_PACK_SCRIPTS_DIR/$packname.sh"
    [ -x "$repackcode" ] || fatal "Can't find script $repackcode for packname $packname"
    [ -f "$repackcode.rpmnew" ] && warning "There is .rpmnew file(s) in $EPM_PACK_SCRIPTS_DIR dir. The pack script can be outdated."

    tmpdir="$(mktemp -d)"
    filefortarname="$tmpdir/filefortarname"
    trap "rm -rf $tmpdir" EXIT

    set_sudo
    export SUDO

    # TODO: inside () ?
    export PATH=$PROGDIR:$PATH

    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x'
    #info "Running $($script --description 2>/dev/null) ..."
    ( unset EPMCURDIR ; docmd $CMDSHELL $bashopt $repackcode "$tarname" "$filefortarname" ) || fatal
    returntarname="$(cat "$filefortarname")" || fatal "pack script $repackcode didn't set tarname"
    rm -rf $tmpdir

    [ -s "$returntarname" ] || fatal "pack script $repackcode didn't return tarname"

    #local newname="$(basename "$returntarname")"

    # now it is by default in the current dir
    #if [ "$returntarname" != "$(realpath $newname)" ; then
    #    # repack put its result to the current dir
    #    mv -v $returntarname . || fatal
    #fi

    if [ -n "$download_only" ] ; then
        return
    fi

    trap "rm -v $returntarname" EXIT

    # FIXME: __epm_repack will drop trap
    repacked_pkgs=''
    # repack to our target
    if __epm_repack_if_needed $returntarname ; then
        [ -n "$repacked_pkgs" ] || fatal "Can't repack $returntarname"
    # if repack is forced or repack rule (not disabled) is exists
    elif [ -n "$repack" ] || [ -z "$norepack" ] && __epm_have_repack_rule $returntarname ; then
        __epm_repack "$returntarname"
        [ -n "$repacked_pkgs" ] || fatal "Can't repack $returntarname"
    fi

    if [ -n "$repacked_pkgs" ] ; then
        rm -v $returntarname
        mv -v $repacked_pkgs . || fatal
        pkgname=$(pwd)/"$(basename $repacked_pkgs)"
    else
        pkgname="$returntarname"
    fi

    if [ -n "$install" ] ; then
        trap "rm -v $pkgname" EXIT
        docmd epm install $pkgname
        return
    fi

    trap "" EXIT

}

epm_pack_help()
{
    cat <<EOF
epm pack - create rpm package from files
Usage: epm pack [options] <packname> <tar|url|dir>
Options:
    <packname>            - receipt
    <dir>                 - create tarball from the dir before
    <url>                 - download tar from url
    --install             - install after pack result
    --repack              - force repack ever if returned package can be installed without repack
    --download-only       - save pack result and exit
    --save-only           - save repacked packages and exit (this is default behaviour)
EOF
}


epm_pack()
{

    if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
        epm_pack_help
        exit
    fi

#TODO
    trap "__epm_remove_tmp_files" EXIT

    local packname="$1"
    local tarname="$2"

    [ -n "$packname" ] || fatal "run with packname, see --help"

    if is_url "$tarname"; then
        pkg_urls="$tarname"
        load_helper epm-download
        __handle_pkg_urls_to_install
        # drop spaces and get full path
        tarname="$(realpath $pkg_files)"
    elif [ -d "$tarname" ] ; then
        fatal "FIXME: implement packing of the dir $tarname?"
        tarname=''
    elif [ -s "$tarname" ] ; then
        # get full path for real name
        tarname="$(realpath "$tarname")"
    else
        # just pass name
        true
    fi

    __epm_pack "$packname" "$tarname"

}