#!/bin/sh -eu
# vim: set ts=2 sw=2 et:

LOCAL_PROJECT_PATH="${1-$PWD}"

TARGET_ARCH="${2-amd64}"

DOCKER_IMAGE=""

BUILD_COMMAND=" \
  shards build --static --release \
  && chown 1000:1000 -R bin \
  && find bin -type f -maxdepth 1 -exec mv {} {}_${TARGET_ARCH} \; \
"
INSTALL_CRYSTAL=" \
  echo '@edge http://dl-cdn.alpinelinux.org/alpine/edge/community' >>/etc/apk/repositories \
  && apk add --update --no-cache --force-overwrite \
    crystal@edge \
    g++ \
    gc-dev \
    libxml2-dev \
    llvm16-dev \
    llvm16-static \
    make \
    musl-dev \
    openssl-dev \
    openssl-libs-static \
    pcre-dev \
    shards@edge \
    yaml-dev \
    yaml-static \
    zlib-dev \
    zlib-static \
"

# setup arch
case "$TARGET_ARCH" in
  amd64) DOCKER_IMAGE="alpine" ;;
  arm64) DOCKER_IMAGE="multiarch/alpine:aarch64-edge" ;;
  armel) DOCKER_IMAGE="multiarch/alpine:armv7-edge" ;;
  # armhf) DOCKER_IMAGE="multiarch/alpine:armhf-edge" ;;
  # i386)  DOCKER_IMAGE="multiarch/alpine:x86-edge" ;;
  mips)  DOCKER_IMAGE="multiarch/alpine:mips-edge" ;;
  mipsel)  DOCKER_IMAGE="multiarch/alpine:mipsel-edge" ;;
  powerpc)  DOCKER_IMAGE="multiarch/alpine:powerpc-edge" ;;
  ppc64el)  DOCKER_IMAGE="multiarch/alpine:ppc64el-edge" ;;
  s390x)  DOCKER_IMAGE="multiarch/alpine:s390x-edge" ;;
esac

# Compile Crystal project statically for target architecture
docker pull multiarch/qemu-user-static:register
docker run \
  --rm \
  --privileged \
  multiarch/qemu-user-static:register \
  --reset
docker run \
  -it \
  -v "$LOCAL_PROJECT_PATH:/app" \
  -w /app \
  --rm \
  "$DOCKER_IMAGE" \
  /bin/sh -c "$INSTALL_CRYSTAL && $BUILD_COMMAND"