#!/usr/bin/env bash
set -eo pipefail
shopt -s expand_aliases

log_level="error"
if [[ "${DRYCC_DEBUG}" ]]; then
    log_level="debug"
    unset DRYCC_DEBUG
fi

alias podman='podman --log-level ${log_level} --cgroup-manager=cgroupfs --events-backend=file'

function clean_before_exit {
    # delay before exiting, so stdout/stderr flushes through the logging system
    pkill -15 caddy
    pkill -15 podman
    sleep 3
}
trap clean_before_exit EXIT

function waiting_process {
    echo -e "\\033[32m---> Waiting $1 running.\\033[0m"
    for i in {0..4}; do
        if ps -C "$1" 1>/dev/null ; then
            sleep 1
            echo -e "\\033[32m---> Process $1 started.\\033[0m"
            break
        else
            if [[ $i == 3 ]]; then
                echo -e "\\033[31m---> Process $1 failed.\\033[0m"
                exit 1
            else
                sleep 3
            fi
        fi
    done
}

CONTAINERS_CONFIG_DIR="${HOME}"/.config/containers
mkdir -p "${CONTAINERS_CONFIG_DIR}"
from_registries_file="/etc/imagebuilder/registries.conf"
cp -rf /opt/drycc/podman/etc/containers/* "${CONTAINERS_CONFIG_DIR}"
if [ -f "${from_registries_file}" ]; then
    install -D  "${from_registries_file}" "${CONTAINERS_CONFIG_DIR}"/registries.conf
fi

# The directory cannot be changed, the position is hard coded, pack cli needs to be used.
# https://github.com/buildpacks/pack/blob/main/internal/docker/context.go
REGISTRY_AUTH_FILE="${HOME}"/.docker/config.json
readonly REGISTRY_AUTH_FILE
from_auths_file="/etc/imagebuilder/auths.json"
if [ -f "${from_auths_file}" ]; then
    install -D "${from_auths_file}" "${REGISTRY_AUTH_FILE}"
fi
export REGISTRY_AUTH_FILE

podman system service --time 0 &

waiting_process podman
if [[ -n "${TAR_PATH}" ]]; then
    get_object
    tar -xzf /tmp/app.tgz -C /workspace/ && unset TAR_PATH
fi

pack_builder=$(< /etc/imagebuilder/buildpacks tr -d '[:space:]')
if [[ -f .pack-builder ]]; then
    pack_builder=$(< .pack-builder tr -d '[:space:]')
fi

# Get registry and login
if [[ "${DRYCC_REGISTRY_LOCATION}" == "off-cluster" ]] ; then
    podman login \
        --username "${DRYCC_REGISTRY_USERNAME}" \
        --password "${DRYCC_REGISTRY_PASSWORD}" \
        "${DRYCC_REGISTRY_HOST}" \
        --tls-verify=false > /dev/null
else
    # Start registry proxy
    DRYCC_REGISTRY_PROXY_HOST="${DRYCC_REGISTRY_PROXY_HOST:?DRYCC_REGISTRY_PROXY_HOST env required}"
    DRYCC_REGISTRY_PROXY_PORT=$(echo "${DRYCC_REGISTRY_PROXY_HOST}" | awk -F ':' '{print $2}')
    caddy_command="caddy reverse-proxy \
        --from :${DRYCC_REGISTRY_PROXY_PORT} \
        --to ${DRYCC_REGISTRY_HOST}"
    if [[ ${log_level} != "debug" ]] ; then
        caddy_command="${caddy_command} > /dev/null"
    fi
    $caddy_command 2>&1 &
    waiting_process caddy
    podman login \
        --username "${DRYCC_REGISTRY_USERNAME}" \
        --password "${DRYCC_REGISTRY_PASSWORD}" \
        "${DRYCC_REGISTRY_PROXY_HOST}" \
        --tls-verify=false > /dev/null
fi

# Get image name and image tag
drycc_app=$(echo "${IMAGE_NAME}" | awk -F '/' '{print $NF}' | awk -F ':' '{print $1}')
image_tag=$(echo "${IMAGE_NAME}" | awk -F ':' '{print $NF}')
image_base_name=$(echo "${IMAGE_NAME}" | sed -s "s#:${image_tag}##g")
image_cache_name="${image_base_name}":cache
image_latest_name="${image_base_name}":latest

# Building
if [[ "${DRYCC_STACK}" == "container" ]] ; then
    echo "---> Building container"
    podman_build="podman build . --tag ${IMAGE_NAME} --network host"
    podman_push="podman push ${IMAGE_NAME} --tls-verify=false"
    if [[ -f .build-env ]] ; then
        for build_arg in $( < .build-env )
        do
            podman_build="$podman_build --build-arg $build_arg"
        done
    fi
    $podman_build
    $podman_push
else
    echo "---> Building pack"
    echo "---> Using builder ${pack_builder}"
    # podman connection
    DOCKER_HOST="unix://$(podman info -f '{{.Host.RemoteSocket.Path}}')"
    readonly DOCKER_HOST
    export DOCKER_HOST

    pack_build="pack build ${IMAGE_NAME} \
            --builder ${pack_builder} \
            --lifecycle-image ${pack_builder} \
            --env DRYCC_APP=${drycc_app} \
            --docker-host ${DOCKER_HOST} \
            --previous-image ${image_latest_name} \
            --publish \
            --cache-image ${image_cache_name} \
            --tag ${image_latest_name} \
            --default-process web \
            --network host"
    if [[ $log_level == "debug" ]] ; then
        pack_build="$pack_build --verbose"
    fi
    if [[ -f .clear-cache ]]; then
        pack_build="$pack_build --clear-cache"
    fi
    if [[ -f .build-env ]] ; then
        pack_build="$pack_build --env-file .build-env"
    fi
    $pack_build
fi