#!/bin/sh
#
# Copyright (C) 2017-2018, 2020  Etersoft
# Copyright (C) 2017-2018, 2020  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

[ -n "$EPM_REPACK_SCRIPTS_DIR" ] || EPM_REPACK_SCRIPTS_DIR="$CONFIGDIR/repack.d"

__epm_have_repack_rule()
{
    # skip repacking on non ALT systems
    [ "$BASEDISTRNAME" = "alt" ] || return 1

    # FIXME: use real way (for any archive)
    local pkgname="$(epm print name for package "$1")"
    local repackcode="$EPM_REPACK_SCRIPTS_DIR/$pkgname.sh"
    [ -s "$repackcode" ]
}

__epm_check_if_needed_repack()
{
    __epm_have_repack_rule "$@" || return
    local pkgname="$(epm print name for package "$1")"
    warning "There is repack rule for '$pkgname' package. It is better install this package via 'epm --repack install' or 'epm play'."
}

# arg: rpm or deb
# fills split_replaced_pkgs with packages of that type
__epm_split_by_pkg_type()
{
	local type="$1"
	shift

	split_replaced_pkgs=''

	for pkg in "$@" ; do
		[ "$(get_package_type "$pkg")" = "$type" ] || return 1
		[ -e "$pkg" ] || fatal "Can't read $pkg"
		split_replaced_pkgs="$split_replaced_pkgs $pkg"
	done

	[ -n "$split_replaced_pkgs" ]
}


# $spec $PKGNAME $VERSION
__set_name_version()
{
    SPEC="$1"
    PKGNAME="$2"
    VERSION="$3"
    [ -n "$PKGNAME" ] && subst "s|^Name:.*|Name: $PKGNAME|" $SPEC
    [ -n "$VERSION" ] && subst "s|^Version:.*|Version: $VERSION|" $SPEC
}


__check_stoplist()
{
    local pkg="$1"
    local alf="$CONFIGDIR/repackstoplist.list"
    [ -s "$alf" ] || return 1
    [ -n "$pkg" ] || return 1
    grep -E -q "^$1$" $alf
}


__set_version_pkgname()
{
    local alpkg="$1"
    VERSION="$(echo "$alpkg" | grep -o -P '[-_.][0-9][0-9]*([.]*[0-9])*' | head -n1 | sed -e 's|^[-_.]||')" #"
    [ -n "$VERSION" ] && PKGNAME="$(echo "$alpkg" | sed -e "s|[-_.]$VERSION.*||")"
    # set version as all between name and extension
    #local woext="$(echo "alpkg" | sed -e 's|\.tar.*||')"
    #if [ "$woext" != "$alpkg" ] ; then
    #    VERSION="$(echo "$woext" " | sed -e "s|^$PKGNAME[-_.]||")"
    #fi
}


# AppImage version
# hack for ktalk2.4.2 -> ktalk 2.4.2
__set_version_apppkgname()
{
    local alpkg="$1"
    VERSION="$(echo "$alpkg" | grep -o -P "[-_.a-zA-Z]([0-9])([0-9])*([.]*[0-9])*" | head -n1 | sed -e 's|^[-_.a-zA-Z]||' -e 's|--|-|g' )"  #"
    [ -n "$VERSION" ] && PKGNAME="$(echo "$alpkg" | sed -e "s|[-_.]$VERSION.*||")"
}


# arg: <package file>
# sets:
#   alpkg      - package file name without path
#   PKGNAME    - package name
#   VERSION    - version of the package
#   SUBGENERIC - name of generic file's extension
__prepare_source_package()
{
    local pkg="$1"

    alpkg=$(basename $pkg)

    # TODO: use func for get name from deb pkg
    # TODO: epm print name from deb package
    # TODO: use stoplist only for deb?
    [ -z "$force" ] && __check_stoplist $(echo $alpkg | sed -e "s|_.*||") && fatal "Please use official package instead of $alpkg repacking (It is not recommended to use --force to skip this checking."

    PKGNAME=''
    VERSION=''
    SUBGENERIC=''

    # convert tarballs to tar (for alien)
    if rhas "$alpkg" "\.(rpm|deb)$" ; then
        return
    fi

    if rhas "$alpkg" "\.AppImage$" ; then
        __set_version_apppkgname $alpkg
        [ -n "$VERSION" ] || fatal "Can't get version from $alpkg."
        SUBGENERIC='appimage'
        # TODO: move repack archive to erc?
        [ -x "$alpkg" ] || docmd chmod u+x $verbose "$alpkg"
        ./$alpkg --appimage-extract || fatal
        alpkg=$PKGNAME-$VERSION.tar
        # make a tar for alien
        erc a $alpkg squashfs-root
        return
    fi

    __set_version_pkgname $alpkg
    if [ -n "$VERSION" ] ; then
        # TODO: don't use erc for detect type? then we potentially can skip install it
        pkgtype="$(erc type $alpkg)"
        local newalpkg
        newalpkg=$PKGNAME-$VERSION.$pkgtype
        #[ -n "$PKGNAME" ] || PKGNAME=$(basename $alpkg .$pkgtype)
        if [ "$pkgtype" = "tar" ] || [ "$pkgtype" = "tar.gz" ] || [ "$pkgtype" = "tgz" ] ; then
            # just rename supported formats
            if [ "$alpkg" != "$newalpkg" ] ; then
                mv $alpkg $newalpkg
            fi
        else
            # converts directly unsupported formats
            newalpkg=$PKGNAME-$VERSION.tar
            #newalpkg=$(basename $alpkg .$pkgtype).tar
            erc repack $alpkg $newalpkg || fatal
        fi
        if [ "$alpkg" != "$newalpkg" ] ; then
            rm -f $verbose $alpkg
            alpkg=$newalpkg
        fi
    else
        warning "Can't detect version in $alpkg. We have almost no chance it will supported in alien."
    fi
}




# FIXME: Нужно как-то обеспечить непродолжение выполнения.
# used in epm install
# fill repacked_pkgs
__epm_repack()
{
	repacked_pkgs=''
	case $PKGFORMAT in
		rpm)
			load_helper epm-repack-rpm
			__epm_repack_to_rpm "$@" || return
			;;
		deb)
			# FIXME: only one package in $@ is supported
			#local pkgname="$(epm print name from "$@")"
			__set_version_pkgname "$1"
			local repackcode="$EPM_REPACK_SCRIPTS_DIR/$PKGNAME.sh"
			if [ -x "$repackcode" ] ; then
				load_helper epm-repack-rpm
				load_helper epm-repack-deb
				__epm_repack_to_rpm "$@" || return
				[ -n "$repacked_pkgs" ] || return
				__epm_repack_to_deb $repacked_pkgs
			else
				load_helper epm-repack-deb
				__epm_repack_to_deb "$@" || return
			fi
			;;
		*)
			fatal "$PKGFORMAT is not supported for repack yet"
			;;
	esac

	return 0
}

__epm_repack_if_needed()
{
	# return 1 if there is a package in host package format
	__epm_split_by_pkg_type $PKGFORMAT "$@" && return 1

	__epm_repack "$@"
	return 0
}

epm_repack()
{
    # if possible, it will put pkg_urls into pkg_files and reconstruct pkg_filenames
    if [ -n "$pkg_urls" ] ; then
        load_helper epm-download
        __handle_pkg_urls_to_install
    fi

    [ -n "$pkg_names" ] && warning "Can't find $pkg_names files"
    [ -z "$pkg_files" ] && info "Skip empty repack list" && return 22

    if __epm_repack $pkg_files && [ -n "$repacked_pkgs" ] ; then
        if [ -n "$install" ] ; then
            epm install $repacked_pkgs
            return
        fi

        cp $repacked_pkgs "$EPMCURDIR"
        if [ -z "$quiet" ] ; then
            echo
            echo "Adapted packages:"
            for i in $repacked_pkgs ; do
                echo "	$EPMCURDIR/$(basename "$i")"
            done
        fi
    fi

    __epm_remove_tmp_files
}