#!/bin/bash

# **************************** LICENSE START ***********************************
#
# Copyright 2013 ECMWF and INPE. This software is distributed under the terms
# of the Apache License version 2.0. In applying this license, ECMWF does not
# waive the privileges and immunities granted to it by virtue of its status as
# an Intergovernmental Organization or submit itself to any jurisdiction.
#
# ***************************** LICENSE END ************************************

set -x

function print_err()
{
    echo ${text_ERR}  $* >> "${f_LOG}"
}

function print_warn()
{
    echo "WARNING: "  $* >> "${f_LOG}"
}

text_ERR="ERROR: script `basename $0` FAILED! "

function unique_name()
{
    local f_INP=$1
    local suffixes=""
    local suffix=""

    if [[ $# -eq 2 ]] ; then
        suffixes=$2
    fi

    d=$(dirname "$f_INP")
    fname=$(basename "$f_INP")

    for s in $(echo $suffixes | tr "," "\n") ; do
        t=${f_INP##*$s}
        if [ -z $t ] ; then
            suffix=$s
            break
        fi
    done

    n=$(basename "$f_INP" "$suffix")
    cd "$d"

    if [[ $(find . -maxdepth 1 -name "$n" | wc -l) -eq 0 ]] ; then
        echo $n
        return
    fi

    maxNum=$(find . -maxdepth 1 -name "*" | wc -l)

    i=1
    fn="$n"_$i
    while [ $i -lt $maxNum ]  ; do
        fn="$n"_$i
        if [[ $(find . -maxdepth 1 -name "$fn" | wc -l) -eq 0 ]] ; then
            echo $fn
            exit 0
        fi
        i=$(($i + 1))
    done

    echo "$n"_$maxNum
}

# strip the suffix from a filename using a potential list of suffixes
function target_filename()
{
    local f_INP=$1
    local suffixes=""

    if [[ $# -eq 2 ]] ; then
        suffixes=$2
    fi

    d=$(dirname "$f_INP")
    fname=$(basename "$f_INP")

    for s in $(echo $suffixes | tr "," "\n") ; do
        t=${f_INP##*$s}
        if [ -z $t ] ; then
            suffix=$s
            echo $(basename "$f_INP" $suffix)
            return
        fi
    done

    echo "$f_INP"
}

#--------------------------------------------
# Main
#--------------------------------------------

f_INPUT=$1
METHOD=$2
MODE=$3     

if [  $# -eq 0 ] ; then
    print_err "No input path specified!"
    exit 1
fi

if [[  $MODE != "ext" && $MODE != "sub" && $MODE != "exam" ]] ; then
    print_err "Invalid MODE=$MODE specified!"
    exit 1
fi

REDIRECT=0
TMP_SUFFIX=".tar_contents.txt"

case $METHOD in
        tar_gz)
                EXTRACT_CMD="tar -xzvf"
                EXAMINE_CMD="tar -tzvf"
                SUFFIX=".tar.gz,.tgz,.tar.gzip"
                ;;
        tar_bz2)
                EXTRACT_CMD="tar -xjvf"
                EXAMINE_CMD="tar -tjvf"
                SUFFIX=".tar.bz2,.tbz,.tar.bzip2,.tar.bzip"
                ;;
        tar_z)
                EXTRACT_CMD="tar -xzvf"
                EXAMINE_CMD="tar -tzvf"
                SUFFIX=".tar.z,.tz,.tar.Z"
                ;;
        tar)
                EXTRACT_CMD="tar -xvf"
                EXAMINE_CMD="tar -tvf"
                SUFFIX=".tar"               
                ;;
        zip)
                EXTRACT_CMD="unzip"
                EXAMINE_CMD="unzip -l"
                SUFFIX=".zip,.ZIP"
                ;;
        gz)
                EXTRACT_CMD="gunzip"
                if [[ $MODE == "sub" ]] ; then
                    EXTRACT_CMD="gunzip -c"
                    REDIRECT=1
                fi
                SUFFIX=".gz,.gzip"
                ;;
         bz2)
                EXTRACT_CMD="bzip2"
                if [[ $MODE == "sub" ]] ; then
                    EXTRACT_CMD="bzip2 -c"
                    REDIRECT=1
                fi
                SUFFIX=".bz2,.bzip2,.bz,.bzip2"
                ;;
         z)
                EXTRACT_CMD="uncompress"
                if [[ $MODE == "sub" ]] ; then
                    EXTRACT_CMD="uncompress -c"
                    REDIRECT=1
                 fi
                 SUFFIX=".z,.Z"
                 ;;
        *)
                print_err "No METHOD valid is specified"
                exit 1
                ;;
esac

# figure out input dir and enter it
d_INPUT=$(dirname "$f_INPUT")
cd $d_INPUT
#echo "d_INPUT=$d_INPUT"
#echo "EXTRACT_CMD=$EXTRACT_CMD"

if [[ $MODE == "ext" ]] ; then
    #echo "no subdir f_INPUT=$f_INPUT"
    $($EXTRACT_CMD "$f_INPUT")
elif [[ $MODE == "sub" ]] ; then
    d_OUTPUT=$(unique_name "$f_INPUT" $SUFFIX)
    #echo "subdir d_OUTPUT=$d_OUTPUT"
    mkdir "$d_OUTPUT"
    cd "$d_OUTPUT"
    if [[ $REDIRECT -ne 1 ]] ; then
        $($EXTRACT_CMD "$f_INPUT")
    else
        target=$(target_filename "$f_INPUT" $SUFFIX)
        #echo "target=$target"
        $($EXTRACT_CMD "$f_INPUT" > "$target")
    fi
else
    d_OUTPUT=$TMPDIR/$(basename "$f_INPUT")${TMP_SUFFIX}
    $($EXAMINE_CMD "$f_INPUT" > "${d_OUTPUT}")
    $METVIEW_TEXT_VIEWER "$d_OUTPUT"
fi


exit 0
