#!/bin/bash
set -e

RUNDIR="$PWD"

PROGRAM_NAME="мавка"
BUILD_VERSION=$(cat машина/ВЕРСІЯ)
BUILD_PLATFORM="$1"

print_usage() {
  echo "Usage: $0 <platform>"
  echo "Supported platforms: linux-x86_64, linux-aarch64, macos-x86_64, macos-aarch64, windows-x86_64, windows-aarch64, android-aarch64"
}

set_platform_vars() {
  local platform="$1"
  local system arch tsil_system tsil_arch outfile

  case "$platform" in
    linux-x86_64)
      system="linux"; arch="x86_64"; tsil_system="лінукс"; tsil_arch="ікс86_64"; outfile="$PROGRAM_NAME" ;;
    linux-aarch64)
      system="linux"; arch="aarch64"; tsil_system="лінукс"; tsil_arch="аарч64"; outfile="$PROGRAM_NAME" ;;
    macos-x86_64)
      system="macos"; arch="x86_64"; tsil_system="макос"; tsil_arch="ікс86_64"; outfile="$PROGRAM_NAME" ;;
    macos-aarch64)
      system="macos"; arch="aarch64"; tsil_system="макос"; tsil_arch="аарч64"; outfile="$PROGRAM_NAME" ;;
    windows-x86_64)
      system="windows"; arch="x86_64"; tsil_system="віндовс"; tsil_arch="ікс86_64"; outfile="$PROGRAM_NAME.exe" ;;
    windows-aarch64)
      system="windows"; arch="aarch64"; tsil_system="віндовс"; tsil_arch="аарч64"; outfile="$PROGRAM_NAME.exe" ;;
    android-aarch64)
      system="android"; arch="aarch64"; tsil_system="андроїд"; tsil_arch="аарч64"; outfile="$PROGRAM_NAME" ;;
    *)
      echo "Unsupported build platform: $platform"
      exit 1 ;;
  esac

  BUILD_SYSTEM="$system"
  BUILD_ARCH="$arch"
  TSIL_SYSTEM="$tsil_system"
  TSIL_ARCH="$tsil_arch"
  OUTFILENAME="$outfile"
}

if [ -z "$BUILD_PLATFORM" ]; then
  print_usage
  exit 1
fi

set_platform_vars "$BUILD_PLATFORM"

VERSIONDIR="випуски/$BUILD_VERSION"
PLATFORMDIRNAME="$PROGRAM_NAME-$BUILD_VERSION-$TSIL_SYSTEM-$TSIL_ARCH"
PLATFORMDIR="$VERSIONDIR/$PLATFORMDIRNAME"
BINDIR="$PLATFORMDIR"

[[ "$BUILD_SYSTEM" == "linux" || "$BUILD_SYSTEM" == "macos" || "$BUILD_SYSTEM" == "android" ]] && BINDIR="$PLATFORMDIR/програми"

mkdir -p "$BINDIR"

prepare_platform_dir() {
  echo "$PWD"
  cp "будування/$BUILD_VERSION/$TSIL_SYSTEM-$TSIL_ARCH/готове/$OUTFILENAME" "$BINDIR"
  # mkdir -p "$PLATFORMDIR/визначення"
  # cp -a "бібліотека/визначення" "$PLATFORMDIR"
  # cp -a "машина/визначення" "$PLATFORMDIR"
  cp ДОЗВІЛ "$PLATFORMDIR/ДОЗВІЛ"
  cp LICENSE "$PLATFORMDIR/LICENSE"
}

create_platform_tarball() {
  cd "$VERSIONDIR"
  tar -cJvf "$PROGRAM_NAME-$BUILD_VERSION-$TSIL_SYSTEM-$TSIL_ARCH.tar.xz" "$PLATFORMDIRNAME"
  rm -rf "$PLATFORMDIRNAME"
  cd - > /dev/null
}

prepare_platform_dir
create_platform_tarball

get_gpg_fingerprint() {
  gpg --with-colons --list-secret-keys --fingerprint | awk -F: '/^fpr:/ {print $10; exit}'
}

sign_release_files() {
  local private_key="$RUNDIR/.releasegpgkey"
  local passphrase_file="$RUNDIR/.releasegpgkeypassphrase"
  local tmp_gpg_home=$(mktemp -d)

  export GNUPGHOME="$tmp_gpg_home"

  gpg --batch --yes --import "$private_key" >/dev/null 2>&1

  local fingerprint=$(get_gpg_fingerprint)
  if [ -z "$fingerprint" ]; then
    echo "Failed to get fingerprint (no secret key found)"
    rm -rf "$tmp_gpg_home"
    exit 1
  fi

  echo "Using fingerprint: $fingerprint"

  local passphrase=$(<"$passphrase_file")

  cd "$VERSIONDIR"

  for file in $PROGRAM_NAME-"$BUILD_VERSION"-$TSIL_SYSTEM-$TSIL_ARCH.tar.xz; do
    [ ! -f "$file" ] && { echo "File not found: $file"; continue; }

    sha256sum "$file" > "$file.sha256"
    gpg --batch --yes --pinentry-mode loopback --passphrase "$passphrase" \
      --local-user "$fingerprint" --clearsign --output "$file.sha256.signed" "$file.sha256"
  done

  cd - > /dev/null
  rm -rf "$tmp_gpg_home"
}

if [ -f ".releasegpgkey" ] && [ -f ".releasegpgkeypassphrase" ]; then
  sign_release_files
fi