#!/bin/bash
# Copyright 2018 Zoho Corp, Inc. All rights reserved.
#
# Usage:
#   * (Install  ZAnalytics into your project in XCode)
#   * In the project editor, select your target.
#   * Click "Build Phases" at the top of the project editor.
#   * Click "Add A New Buid Phase" on the top left corner.
#   * Choose "Add New Run Script Phase."
#   * Paste the following script into the text box after removing the comments.
#

# --- SCRIPT STARTS ---
# API_KEY="<YOUR_API_KEY>"
# DSYM_PATH=$(find $PWD -type f | grep "dsym_upload.sh")
# source $DSYM_PATH
# --- SCRIPT ENDS ---

################################################################################
# Warning : donot edit anything

eval "${GCC_PREPROCESSOR_DEFINITIONS}"

SKIP_PROMPT=0

while [ $# -gt 0 ]; do
case "$1" in
--skip-prompt=*)
SKIP_PROMPT=${1#*=}
;;
*)
printf "**********************************\n"
printf "* Error: Invalid argument passed.*\n"
printf "**********************************\n"
printf "'$1'\n"
exit 1
esac
shift
done

#Apple script alert before dSYM upload
function error_prompt() {
osascript <<EOT
tell app "System Events"

button returned of (display alert "$1" message "$2" buttons {"Ok"} default button 1 as critical giving up after 10)

end tell
EOT
}

if [[ "$INFOPLIST_FILE" == *"$TARGET_BUILD_DIR"* ]]; then
AP_INFO_FILE_NAME="$INFOPLIST_FILE"
else
AP_INFO_FILE_NAME="$TARGET_BUILD_DIR/$INFOPLIST_PATH"
fi

#ZA_INFO_FILE_NAME="ZAnalytics-Config.plist"

ZA_DEPLOYMENT_TARGET=""

ZA_RESOURCE_DIR=${TARGET_BUILD_DIR}/$(dirname "${FRAMEWORKS_FOLDER_PATH}")

ZA_INFO_PLIST_FILE="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZAnalytics.framework/ZAnalyticsResources.bundle/Info.plist"

if [ ! -e "${ZA_INFO_PLIST_FILE}" ]
then
ZA_INFO_PLIST_FILE="${ZA_RESOURCE_DIR}/ZAnalyticsResources.bundle/Info.plist"
fi

if [ "${IPHONEOS_DEPLOYMENT_TARGET}" ]; then
ZA_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET}
PLATFORM="iOS"
fi
if [ "${MACOSX_DEPLOYMENT_TARGET}" ]; then
ZA_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET}
PLATFORM="macOS"
ZA_RESOURCE_DIR=${TARGET_BUILD_DIR}/$(dirname "${FRAMEWORKS_FOLDER_PATH}")/Resources
ZA_INFO_PLIST_FILE="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZAnalytics.framework/Resources/ZAnalyticsResources.bundle/Contents/Info.plist"
if [ ! -e ${ZA_INFO_PLIST_FILE} ]
then
ZA_INFO_PLIST_FILE="${ZA_RESOURCE_DIR}/ZAnalyticsResources.bundle/Contents/Info.plist"
fi
fi
if [ "${TVOS_DEPLOYMENT_TARGET}" ]; then
ZA_DEPLOYMENT_TARGET=${TVOS_DEPLOYMENT_TARGET}
PLATFORM="tvOS"
fi
if [ "${WATCHOS_DEPLOYMENT_TARGET}" ]; then
ZA_DEPLOYMENT_TARGET=${WATCHOS_DEPLOYMENT_TARGET}
PLATFORM="watchOS"
fi

if [ ! "${API_KEY}" ]; then
API_KEY=$(/usr/libexec/PlistBuddy -c 'Print Z_APP_CONFIG:API_KEY' "${AP_INFO_FILE_NAME}")
fi

if [ ! "${API_KEY}" ]; then
value=$(error_prompt "API_KEY missing" "Please provide api key in ${AP_INFOPLIST_FILE}, key=Z_APP_CONFIG:API_KEY, value=<your application API key>")
exit 1
fi

if [ ! "${DEBUG_MODE}" ]; then
DEBUG_MODE=$(/usr/libexec/PlistBuddy -c 'Print Z_APP_CONFIG:ZA_DEBUG_MODE' "${AP_INFO_FILE_NAME}")
fi

if [ -z "${DEBUG_MODE}" ]; then
value=$(error_prompt "ZA_DEBUG_MODE missing" "Please provide ZA_DEBUG_MODE in ${AP_INFOPLIST_FILE}, key=Z_APP_CONFIG:ZA_DEBUG_MODE, value=<0/1/2>")
exit 1
fi

# bash generate random alphanumeric string (upper and lowercase) using uuidgen command
NEW_UUID=$(uuidgen | tr "[:upper:]" "[:lower:]")
#$(date '+%d-%m-%y, %H.%M %p');#

buildgenerationkey=$(/usr/libexec/PlistBuddy -c 'Print Z_APP_CONFIG:ZA_BUILD_GENERATION_KEY' "${AP_INFO_FILE_NAME}" 2>/dev/null || printf "nil")

if [ "${buildgenerationkey}" == "nil" ]; then
buildgenerationkey="${NEW_UUID}"
/usr/libexec/PlistBuddy -c "Add Z_APP_CONFIG:ZA_BUILD_GENERATION_KEY string '${buildgenerationkey}'" "${AP_INFO_FILE_NAME}"
else
buildgenerationkey="${NEW_UUID}"
/usr/libexec/PlistBuddy -c "Set Z_APP_CONFIG:ZA_BUILD_GENERATION_KEY '${buildgenerationkey}'" "${AP_INFO_FILE_NAME}"
fi

DSYM_UPLOAD_ENDPOINT="https://jproxy.zoho.com/api/v4/addDsymfile"

SERVER_URL=$(/usr/libexec/PlistBuddy -c 'Print Z_APP_CONFIG:ZA_SERVER_URL' "${AP_INFO_FILE_NAME}" 2>/dev/null || printf "nil")

if [ "${SERVER_URL}" != "nil" ]; then
DSYM_UPLOAD_ENDPOINT="https://${SERVER_URL}/api/v4/addDsymfile"
echo "SERVER_URL : ${SERVER_URL}"
fi

exitOperation() {
value=$(error_prompt "Error occured" "$1")
exit ${2}
}

echo "Uploading dSYM to ZAnalytics server"


IPADDRESS=$(ipconfig getifaddr en1)
if [ ! "${IPADDRESS}" ]; then
IPADDRESS=$(ipconfig getifaddr en0)
fi

WHOAMI=$(whoami)
# Display build info
BUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleVersion' "${AP_INFO_FILE_NAME}")
BUNDLE_SHORT_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "${AP_INFO_FILE_NAME}")

if [ -e "${ZA_INFO_PLIST_FILE}" ]
then
ZA_BUNDLE_SHORT_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "$ZA_INFO_PLIST_FILE" 2>/dev/null || printf )
fi

if [ ! "${ZA_BUNDLE_SHORT_VERSION}" ]; then
ZA_BUNDLE_SHORT_VERSION=""
else
ZA_BUNDLE_SHORT_VERSION="&frameworkversion=${ZA_BUNDLE_SHORT_VERSION}"
fi

OS="iOS"
if [ "${PLATFORM}" ]; then
OS=${PLATFORM}
fi

echo "Plist Path : ${AP_INFO_FILE_NAME}"
echo "Deployment target: ${ZA_DEPLOYMENT_TARGET}"
echo "Product Name: ${PRODUCT_NAME}"
echo "Version: ${BUNDLE_SHORT_VERSION}"
echo "Build: ${BUNDLE_VERSION}"
echo "Bundle Identifier: ${PRODUCT_BUNDLE_IDENTIFIER}"
echo "App ID: ${APP_ID}"
echo "OS : ${OS}"
echo "API key: ${API_KEY}"

echo "Host : ${WHOAMI}"
echo "DEBUG_MODE : ${DEBUG_MODE}"
echo "ZA_BUNDLE_SHORT_VERSION : ${ZA_BUNDLE_SHORT_VERSION}"
echo "IPADDRESS : ${IPADDRESS}"


DSYM_UPLOAD_PARAMS="mode=${DEBUG_MODE}&platform=${OS}&identifier=${PRODUCT_BUNDLE_IDENTIFIER}&appversion=${BUNDLE_SHORT_VERSION}&buildversion=${BUNDLE_VERSION}&host=${WHOAMI}&remoteaddress=${IPADDRESS}&buildgenerationkey=${buildgenerationkey}&minosversion=${ZA_DEPLOYMENT_TARGET}${ZA_BUNDLE_SHORT_VERSION}"

UPLOAD_SIMULATOR_SYMBOLS=$(/usr/libexec/PlistBuddy -c 'Print Z_APP_CONFIG:ZA_UPLOAD_SIMULATOR_SYMBOLS' "${AP_INFO_FILE_NAME}" 2>/dev/null || printf 1)
# Skip simulator build from uploading

if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
if [ $UPLOAD_SIMULATOR_SYMBOLS == 0 ]; then
exitOperation "skipping simulator build" 0
fi
fi

DSYM_SRC=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
DSYM_ZIP_FPATH="/tmp/$DWARF_DSYM_FILE_NAME $buildgenerationkey"

#Apple script alert before dSYM upload
function prompt() {
osascript <<EOT
tell app "System Events"

button returned of (display alert "$1" message "$2" buttons {"Upload", "Cancel"} default button 1 cancel button 2 as critical giving up after 10)

end tell
EOT
}

if [ $SKIP_PROMPT == 0 ]; then
  value=$(prompt "Should upload dSYMs?" "App name:$PRODUCT_NAME\nBundle id: $PRODUCT_BUNDLE_IDENTIFIER\nVersion:$BUNDLE_SHORT_VERSION($BUNDLE_VERSION)")

  if [ "$?" -ne 0 ]; then
    exit
  fi
else
  echo "Skipping prompt for dsyms upload."
fi

# create dSYM .zip file
echo "dSYM location: ${DSYM_SRC}"
if [ ! -d "${DSYM_SRC}" ]; then
if [ $UPLOAD_SIMULATOR_SYMBOLS == 1 ]; then
exitOperation "dSYM not found, make sure \"Debug information format\" is set to \"DWARF with DSYM File\" under Target Build Settings " 1
fi
exitOperation "dSYM not found: ${DSYM_SRC}" 1
fi

cd "${DWARF_DSYM_FOLDER_PATH}"
mkdir "${DSYM_ZIP_FPATH}"

cp -r *.dSYM "${DSYM_ZIP_FPATH}"
cp -r **/*.dSYM "${DSYM_ZIP_FPATH}" 2>/dev/null

echo "compressing dSYM to: ${DSYM_ZIP_FPATH} ..."

cd /tmp/

(/usr/bin/zip -rv --quiet "${DSYM_ZIP_FPATH}.zip" "$DWARF_DSYM_FILE_NAME $buildgenerationkey") || exitOperation "error: failed creating zip" 1

echo "${DSYM_ZIP_FPATH}.zip"
echo "Archive created."

# Upload dSYM to ZAnalytics server
URL=${DSYM_UPLOAD_ENDPOINT}${APP_ID}
echo "Uploading dSYM to ZAnalytics server: ${URL}?${DSYM_UPLOAD_PARAMS}"

ZA_API_KEY="$(cut -d'_' -f1 <<< ${API_KEY})"

STATUS=$(curl "${URL}?${DSYM_UPLOAD_PARAMS}" --write-out %{http_code} --silent --output /dev/null -F "dsymfile=@${DSYM_ZIP_FPATH}.zip" -H "zak: ${ZA_API_KEY}" -X POST)

echo "ZAnalytics API server response: ${STATUS}"
if [ $STATUS -eq 200 ]; then
echo "Zanalytics dSYM uploaded succesfully."
echo "Cleaning up dSYM archive from tem dir..."
/bin/rm -rv "${DSYM_ZIP_FPATH}.zip"
/bin/rm -rv "${DSYM_ZIP_FPATH}"
else
echo "error: dSYM upload failed"
fi

# Remove dSYM archive from tmp dir

if [ "$?" -ne 0 ]; then
exitOperation "an error was encountered while uploading dSYM to the server" 1
fi




