#!/bin/bash
###############################################################################
#   Copyright 2025 BITart Gerd Knops, All rights reserved.
#
#   Project : GerdsToolSet
#   File    : postArchiveHook
#   Author  : Gerd Knops gerti@BITart.com
#
###############################################################################
#
#   Post-archive hook for Xcode schemes.
#   Captures build environment and spawns Terminal to continue with
#   notarization and packaging.
#
#   Setup in Xcode:
#   1. Edit scheme → Archive → Post-actions
#   2. Add "Run Script Action"
#   3. Set "Provide build settings from" to your target
#   4. Script: ${PROJECT_DIR}/GerdsToolSet/Xcode/buildScripts/postArchiveHook
#
###############################################################################

# Bail out early if the user wants to archive without running the publish pipeline.
if [[ -n "$SKIP_PACKAGING" ]]; then
    echo "SKIP_PACKAGING is set, skipping postArchiveHook"
    exit 0
fi

# Required environment variables from Xcode
: "${ARCHIVE_PATH:?ARCHIVE_PATH not set - must run as Xcode post-archive action}"
: "${ARCHIVE_PRODUCTS_PATH:?ARCHIVE_PRODUCTS_PATH not set}"
: "${FULL_PRODUCT_NAME:?FULL_PRODUCT_NAME not set}"
: "${PRODUCT_NAME:?PRODUCT_NAME not set}"
: "${MARKETING_VERSION:?MARKETING_VERSION not set}"
: "${DEVELOPMENT_TEAM:?DEVELOPMENT_TEAM not set}"
: "${PROJECT_DIR:?PROJECT_DIR not set}"

# Resolve the actual release version from the archived Info.plist (post-UpdateVersionPhaseScript).
# This overrides Xcode's MARKETING_VERSION (e.g., "1.0") with what the user actually sees,
# so zip names, releases dir, and the appcast all match the running app's CFBundleVersion.
ARCHIVED_PLIST="$ARCHIVE_PRODUCTS_PATH/Applications/$FULL_PRODUCT_NAME/Contents/Info.plist"
RESOLVED_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$ARCHIVED_PLIST" 2>/dev/null)

if [[ -z "$RESOLVED_VERSION" ]]; then
    echo "error: CFBundleVersion is empty in $ARCHIVED_PLIST" >&2
    exit 1
fi

MARKETING_VERSION="$RESOLVED_VERSION"

# Path to the notarize script
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
NOTARIZE_SCRIPT="$SCRIPT_DIR/notarizeAndPackage"

# Stable env file path so updateSite can re-render the site from templates after
# a successful archive without needing a fresh build. Lives next to the zip and
# icon in the per-archive working dir — Xcode's "Clean Build Folder" wipes them
# all together. notarizeAndPackage appends ZIP_PATH/ICON_PATH here once known.
ENV_FILE="$BUILD_DIR/Release/lastArchiveEnv.sh"
mkdir -p "$(dirname "$ENV_FILE")"
cat > "$ENV_FILE" << EOF
# Auto-generated by postArchiveHook. Sourced by notarizeAndPackage; reused by
# updateSite when invoked without arguments to redo the post-archive site
# generation against current templates.
export ARCHIVE_PATH="$ARCHIVE_PATH"
export ARCHIVE_PRODUCTS_PATH="$ARCHIVE_PRODUCTS_PATH"
export FULL_PRODUCT_NAME="$FULL_PRODUCT_NAME"
export PRODUCT_NAME="$PRODUCT_NAME"
export MARKETING_VERSION="$MARKETING_VERSION"
export CURRENT_PROJECT_VERSION="${CURRENT_PROJECT_VERSION:-0}"
export DEVELOPMENT_TEAM="$DEVELOPMENT_TEAM"
export PROJECT_DIR="$PROJECT_DIR"
export BUILD_DIR="$BUILD_DIR"
export NOTARIZE_SCRIPT="$NOTARIZE_SCRIPT"
export GTS_APP_NAME="$GTS_APP_NAME"
export GTS_TAG_LINE="$GTS_TAG_LINE"
export GTS_ACCENT_COLOR="$GTS_ACCENT_COLOR"
export GTS_COPYRIGHT="$GTS_COPYRIGHT"
export GTS_MIN_MACOS="$MACOSX_DEPLOYMENT_TARGET"
export GTS_SITE_URL="$GTS_SITE_URL"
export GTS_SITE_DIR="$GTS_SITE_DIR"
export SKIP_NOTARIZATION="$SKIP_NOTARIZATION"
export GTS_ARCHIVE_ENV_FILE="$ENV_FILE"
EOF

# Open Terminal and run the notarize script. The env file is left in place so
# updateSite can re-source it later.
osascript << EOF
tell application "Terminal"
    activate
    do script "source '$ENV_FILE' && \"\$NOTARIZE_SCRIPT\""
end tell
EOF
