#!/bin/bash

if [[ $LD_INTERNAL -ne 1 ]];
then
  export LD_INTERNAL=1
  . $(dirname $(realpath $0))/daisy.source
fi

target=$1

# Check if file exists
if [[ -z "$target" ]];
then
  echo "No target specified."
  exit 1
fi

if ! test -f "$target";
then
  echo "File not found: \"$target\""
  exit 2
fi

# Check if archivemount is present
which archivemount 1>/dev/null 2>/dev/null
hasmounter=$?

file "$target" 1>/dev/null
exitcode=$?
report=$(file "$target")

# Check for archive type, supported types are zip/tar/rar
comm1=(:)
comm2=(echo "Unsupported archive type$add: \"$target\"")
comm3=(:)
comm4=(:)
comm5=(:)

echo $report | grep "tar archive" 1>/dev/null
istar=$?
echo $report | grep "Zip archive" 1>/dev/null
iszip=$?
echo $report | grep "Android" 1>/dev/null
iszip=$?
echo $report | grep "RAR archive" 1>/dev/null
israr=$?

# TAR archives come in many forms, if none of our tests say it's tar
# ...but it looks like tar and barks like tar, let's take the shot.
# Seems to work fairly well for the record.
res=$(echo "$target" | grep ".tar")
if [[ $res != "" ]];
then
  istar=0
fi

if [[ $NO_ARCHIVEMOUNT -eq 1 ]]; then
    hasmounter=1
fi

if (( $hasmounter == 0 )); then
    echo "We have \`archivemount\`, so we'll use that!"
    echo "If you'd prefer we not use it, please specify NO_ARCHIVEMOUNT=1"
    istar=1
    iszip=1
    israr=1
fi

# Now we set the right command
if (( $istar == 0 )); then
    comm2=(tar xvf "$target" -C)
elif (( $iszip == 0 )); then
    which unzip 1>/dev/null
    exitcode=$?
    if (( $exitcode == 0 )); then
        comm2=(unzip -q "$target" -d)
    else
        comm1=(echo "The utility 'unzip' is missing, please install it")
        comm3=(exit 1)
    fi
elif (( $israr == 0 )); then
    which unrar 1>/dev/null
    exitcode=$?
    if (( exitcode == 0 )); then
        comm2=(unrar -i nul "$target")
    else
        comm1=(echo "The utility 'unrar' is missing, please install it")
        comm3=(exit 1)
    fi
elif (( $hasmounter == 0 )); then
    comm2=(archivemount "$target")
    comm4=(cd ..)
    comm5=(umount)
fi

# Create the temp dir, usually
dir=$(mktemp -d /tmp/extracted.XXXXXXXX)

# And the rest of the commands
"${comm1[@]}"
"${comm2[@]}" $dir
"${comm3[@]}"

currentpath=$(realpath .)
cd $dir

# With archivemount, making a symlink will alter the archive
if (( $hasmounter == 1 )); then
    ln -s $currentpath ./link-back
    echo "A symlink to your original path has been created under the name \`link-back\`."
    echo "You can use this to copy out files, but you can also just access your filesystem regularly."
fi

echo "Type 'exit' to exit the extracted archive's folder and auto-delete it."
eval $SHELL
"${comm4[@]}"
"${comm5[@]}" $dir
rm -rf $dir
