#!/usr/bin/env bash
set -e

source $(dirname $0)/env.sh

cd $LUNA_ROOT

PORT_NAME=$1

if ! [ -f ports/$PORT_NAME/PACKAGE ]
then
    echo "Package $PORT_NAME does not exist. Make sure there is a valid PACKAGE file in the appropriate directory!"
    exit 1
fi

export WORKDIR=${WORKDIR:-$LUNA_ROOT/ports/temp}

show_error()
{
    echo $1
    exit 1
}

source ports/$PORT_NAME/PACKAGE

[ -z ${name+x} ] && show_error "error: The port's PACKAGE file does not have a 'name' key."
[ -z ${version+x} ] && show_error "error: The port's PACKAGE file does not have a 'version' key."
[ -z ${format+x} ] && show_error "error: The port's PACKAGE file does not have a 'format' key."
[ -z ${url+x} ] && show_error "error: The port's PACKAGE file does not have a 'url' key."

if [ -x ${skip_dependencies+x} ]; then
    if ! [ -z ${dependencies+x} ]; then
        echo "Installing dependencies of $name: (${dependencies[@]})"
        for dep in ${dependencies[@]}; do
            tools/install-package.sh $dep
        done
    fi
fi

export portdir=$LUNA_ROOT/ports/$name/
export srcdir=${srcdir:-$WORKDIR/$name-$version}
export builddir=$WORKDIR/build-$name
export installdir=$WORKDIR/pkgroot-$name

mkdir -p $WORKDIR
cd $WORKDIR

if [ -z ${skip_download_sources+x} ]; then
    # Download package sources
    case $format in
        tar)
            [ -z ${output+x} ] && show_error "error: The 'tar' download format needs an 'output' key."
            [ -z ${sha256sum+x} ] && show_error "error: The 'tar' download format needs a 'sha256sum' key."
            if ! [ -f $output ]; then 
                echo "Downloading tarball for $name..."
                wget $url --quiet
            else
                echo "Using cached tarball for $name."
            fi
            echo "$sha256sum $output" | sha256sum -c
            tar xf $output
            ;;
        git)
            if ! [ -d $srcdir ]; then
                echo "Cloning repository for $name..."
                git clone $url $srcdir
            else
                echo "Using local repository for $name."
            fi
            if ! [ -z ${tag+x} ]; then
                cd $srcdir
                git checkout $tag
                cd -
            fi
            ;;
        *)
            show_error "error: Unrecognized 'format' key in PACKAGE file: '$format'"
            ;;
    esac
fi

if ! [ "$set_cc_variables" = "no" ]; then
export CC=x86_64-luna-gcc
export CXX=x86_64-luna-g++
export AR=x86_64-luna-ar
export PKG_CONFIG=luna-pkg-config
export CC_FOR_BUILD=gcc
export CXX_FOR_BUILD=g++
export AR_FOR_BUILD=ar
export PKG_CONFIG_FOR_BUILD=pkg-config
fi

mkdir -p $builddir
cd $builddir

if [ -z ${skip_patch+x} ]; then
    declare -F do_patch &>/dev/null && do_patch
fi

if [ -z ${skip_configure+x} ]; then
    echo "Configuring $name..."

    if [ "$use_default_configure" = "true" ]; then
        $srcdir/configure --host=$LUNA_ARCH-luna --prefix=/usr
    elif [ "$use_cmake_configure" = "true" ]; then
        cmake -S $srcdir -B . -DCMAKE_C_COMPILER=$LUNA_ARCH-luna-gcc -DCMAKE_CXX_COMPILER=$LUNA_ARCH-luna-g++ -G "Unix Makefiles"
    else
        declare -F do_configure &>/dev/null || show_error "error: If not using a default configure line, the PACKAGE file must provide a 'do_configure' function."
        do_configure
    fi
fi

if [ -z ${skip_build+x} ]; then
    echo "Building $name..."

    export MAKEJOBS=$(nproc)

    if [ "$default_build_make" = "true" ]; then
        make -j$MAKEJOBS
    elif [ "$default_build_cmake" = "true" ]; then
        cmake --build .
    else
        declare -F do_build &>/dev/null || show_error "error: If not using a default build preset, the PACKAGE file must provide a 'do_build' function."
        do_build
    fi
fi

if [ -z ${skip_install+x} ]; then
    echo "Installing $name..."

    rm -rf $installdir # clean it if it already existed
    mkdir -p $installdir
    export DESTDIR=$installdir

    if [ "$default_install_make" = "true" ]; then
        make install
    elif [ "$default_install_cmake" = "true" ]; then
        cmake --install $builddir --prefix /usr
    else
        declare -F do_install &>/dev/null || show_error "error: If not using a default install preset, the PACKAGE file must provide a 'do_install' function."
        do_install
    fi

    rm -f $installdir/usr/lib/*.la # remove all libtool .la files, as they use host stuff which we don't want at all
    set +e
    $LUNA_ARCH-luna-strip $installdir/usr/bin/* # strip all binaries
    set -e

    cd $installdir

    tar czf $LUNA_ROOT/ports/out/$name-$version.tar.gz *
fi

if [ -z ${preserve_workdir+x} ]; then
    cd $LUNA_ROOT
    rm -rf $WORKDIR
fi