#!/bin/bash
#
# Copyright (C) 2013, 2023  Etersoft
# Copyright (C) 2013, 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/>.
#

have_patool()
{
	# TODO: optimize?
	[ -n "$use_7z" ] && return 1
	[ -n "$use_patool" ] || is_command patool
}

set_backend()
{
	HAVE_7Z='7z'

	[ "$ERC_BACKEND" = "patool" ] && use_patool=1
	[ "$ERC_BACKEND" = "7z" ] && use_7z=1

	[ -n "$use_patool" ] && [ -n "$use_7z" ] && fatal "Don't use --use-7z and --use-patool simulateously."

	if [ -n "$use_7z" ] || ! have_patool ; then
		# TODO: try install patool and p7zip
		is_command 7za && HAVE_7Z='7za'
		if ! is_command $HAVE_7Z ; then
			# 7-zip
			is_command 7zz && HAVE_7Z='7zz'
		fi
		if ! is_command $HAVE_7Z ; then
			# reduced p7-zip
			is_command 7zr && HAVE_7Z='7zr'
		fi
		is_command $HAVE_7Z || fatal "Could not find any patool or 7-zip backend. Please install p7zip package and retry."
	fi
	[ -z "$force" ] || HAVE_7Z="$HAVE_7Z -y"
}


list_subformats()
{
	local i
	for i in gz bz2 xz bzip2 lz4 lzma zst zstd ; do
		echo "tar.$i"
	done

	for i in gz bz2 xz lz4 ; do
		echo "cpio.$i"
	done
}

list_extraformats()
{
	cat <<EOF
bz2
gz
lz4
Z
tgz
pax
zst
zstd
exe
AppImage
appimage
EOF
}

# it is extension list really
# list all supported formats: tar rar and so on
list_formats()
{
	list_subformats
	if have_patool ; then
		a='' patool formats | grep ".* files:" | sed "s/ .*//g"
	else
		echo "tar zip 7z tar.7z"
		list_subformats
	fi
	# TODO: do not use patool formats in such case?
	# See ArchiveCompressions in patool
	list_extraformats
}

# returns true if arg is XXX: from list_formats
is_target_format()
{
	[ "${1/:/}" = "$1" ] && return 1
	local arc="$(echo "$1" | sed -e 's|:.*||g')"
	list_formats | grep -q "^$arc$" && return 0
	return 1
}

# TODO: detect by name, without comparing with existing?
# 1.zip -> zip
get_archive_ext()
{
	local i
	for i in $(list_formats) ; do
		[ -z "${1/*.$i/}" ] && echo "$i" && return
	done
	return 1
}

# 1.zip -> 1
get_archive_name()
{
	local ext
	ext=$(get_archive_ext "$1")
	if [ -n "$ext" ] ; then
		echo $(dirname "$1")/$(basename "$1" .$ext)
	else
		echo "$1"
		return 1
	fi
}

# FIXME
is_plain_text()
{
	file --mime-type "$1" | grep -q "text/" && echo "plain" && return
	file "$1" | grep -q "empty" && echo "plain" && return
	return 1
}


# TODO: improve
# TODO: detect by extension as default
get_archive_type()
{
	local aext
	if [ -r "$1" ] ; then
		# TODO: rewrite with mime
		file "$1" | grep -q "Zip archive data" && echo "zip" && return
		file "$1" | grep -q "RAR archive data" && echo "rar" && return
	# used for unexists files too
	#else
	#	warning "Couldn't read $1, skipping mime checking"
	fi

	if aext=$(get_archive_ext "$1") ; then
		echo $aext
		return
	fi
	return 1
}

extract_command() {
    local cmd="$1"
    local archive="$2"

    if is_command tar; then
        docmd $cmd "$archive"
    else
        docmd $HAVE_7Z x -so "$archive" | docmd $HAVE_7Z x -y -si -ttar
    fi
}