#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Make sure that maven installed on your PC.

if [[ $1 = "" ]] ; then
    echo "Version must be set as input parameter."
    exit 1
fi

#
# Change this for your local GPG fingerprint:
# ===========================================
localUser=79BB50129889A04C68BD7A4ABCD48C7B6C94ED02

zipDir=zips
tmpDir=apache-nlpcraft
zipFileBin=apache-nlpcraft-incubating-bin-$1.zip # NOT an official ASF release.
zipFileSrc=apache-nlpcraft-incubating-$1.zip # An OFFICIAL ASF release.
coreModule=nlpcraft
stanfordModule=nlpcraft-stanford
examples=nlpcraft-examples
exampleAlarm=${examples}/alarm
exampleEcho=${examples}/echo
exampleHelloworld=${examples}/helloworld
exampleLightswitch=${examples}/lightswitch
exampleMinecraft=${examples}/minecraft
exampleMinecraftMod=${examples}/minecraft-mod
examplePhone=${examples}/phone
exampleSql=${examples}/sql
exampleTime=${examples}/time
exampleWeather=${examples}/weather

curDir=$(pwd)

cd ../

mvn clean package -P stanford-corenlp,release,examples

cd nlpcraft-examples/minecraft-mod || exit

cd ../../

rm -R ${zipDir} 2> /dev/null

mkdir -p ${zipDir}/${tmpDir}/${coreModule}
mkdir -p ${zipDir}/${tmpDir}/${stanfordModule}
mkdir -p ${zipDir}/${tmpDir}/${exampleAlarm}
mkdir -p ${zipDir}/${tmpDir}/${exampleEcho}
mkdir -p ${zipDir}/${tmpDir}/${exampleHelloworld}
mkdir -p ${zipDir}/${tmpDir}/${exampleLightswitch}
mkdir -p ${zipDir}/${tmpDir}/${exampleMinecraft}
mkdir -p ${zipDir}/${tmpDir}/${exampleMinecraftMod}
mkdir -p ${zipDir}/${tmpDir}/${examplePhone}
mkdir -p ${zipDir}/${tmpDir}/${exampleSql}
mkdir -p ${zipDir}/${tmpDir}/${exampleTime}
mkdir -p ${zipDir}/${tmpDir}/${exampleWeather}

mkdir ${zipDir}/${tmpDir}/build

#=====================#
# Prepare BINARY ZIP. #
#=====================#

rsync -avzq bin ${zipDir}/${tmpDir} --exclude '**/.DS_Store' --exclude bin/prepare.sh --exclude bin/MAVEN-RELEASE.md
rsync -avzq openapi ${zipDir}/${tmpDir} --exclude '**/.DS_Store'

function cpSrc() {
  rsync -avzq "$1"/src ${zipDir}/${tmpDir}/"$1" --exclude '**/.DS_Store' --exclude '**/*.iml'
}

function cpCore {
  rsync -avzq "${coreModule}"/src ${zipDir}/${tmpDir}/"${coreModule}" --exclude '**/.DS_Store' --exclude '**/*.iml' --exclude "main/python/ctxword/data/" --exclude "**/__pycache__/"
}

cpCore
cpSrc ${stanfordModule}
cpSrc ${exampleAlarm}
cpSrc ${exampleEcho}
cpSrc ${exampleHelloworld}
cpSrc ${exampleLightswitch}
cpSrc ${exampleMinecraft}
cpSrc ${exampleMinecraftMod}
cpSrc ${examplePhone}
cpSrc ${exampleSql}
cpSrc ${exampleTime}
cpSrc ${exampleWeather}
rsync -avzq sql ${zipDir}/${tmpDir} --exclude '**/.DS_Store'

cp bindist/LICENSE ${zipDir}/${tmpDir}
cp bindist/NOTICE ${zipDir}/${tmpDir}
cp DISCLAIMER-WIP ${zipDir}/${tmpDir}

cp ${coreModule}/src/main/resources/nlpcraft.conf ${zipDir}/${tmpDir}/build
cp ${coreModule}/src/main/resources/ignite.xml ${zipDir}/${tmpDir}/build
cp ${coreModule}/src/main/resources/log4j2.xml ${zipDir}/${tmpDir}/build

rsync -avzq ${coreModule}/target/*all-deps.jar ${zipDir}/${tmpDir}/build
rsync -avzq ${coreModule}/target/apidocs/** ${zipDir}/${tmpDir}/javadoc --exclude '**/.DS_Store'

function cpExample() {
  mkdir -p ${zipDir}/${tmpDir}/build/"$1"
  cp "$1"/src/main/resources/probe.conf ${zipDir}/${tmpDir}/build/"$1"
  rsync -avzq "$1"/target/*.jar ${zipDir}/${tmpDir}/build/"$1" --exclude '*-sources.jar'
}

rsync -avzq "${stanfordModule}"/target/*.jar ${zipDir}/${tmpDir}/build --exclude '*-sources.jar'

mkdir -p ${zipDir}/${tmpDir}/build/"${exampleMinecraftMod}"
rsync -avzq "${exampleMinecraftMod}"/assets/*.jar ${zipDir}/${tmpDir}/build/"${exampleMinecraftMod}"
cp "${exampleMinecraftMod}"/src/main/resources/nlpcraft-settings.json ${zipDir}/${tmpDir}/build/"${exampleMinecraftMod}"

cpExample ${exampleAlarm}
cpExample ${exampleEcho}
cpExample ${exampleHelloworld}
cpExample ${exampleLightswitch}
cpExample ${exampleMinecraft}
cpExample ${examplePhone}
cpExample ${exampleSql}
cpExample ${exampleTime}
cpExample ${exampleWeather}

# Prepares bin zip.
cd ${zipDir} || exit
zip -rq "${zipFileBin}" ${tmpDir} 2> /dev/null
echo "Binary zip created: " "${zipFileBin}"

# Deletes some data for src zip
rm -R ${tmpDir}/build 2> /dev/null
rm -R ${tmpDir}/javadoc 2> /dev/null

#=====================#
# Prepare SOURCE ZIP. #
#=====================#

# Adds some data for src zip.
cd ../
mkdir ${zipDir}/${tmpDir}/javadoc

function cpPom() {
  cp "$1"/pom.xml ${zipDir}/${tmpDir}/"$1"
}

cpPom ${coreModule}
cpPom ${stanfordModule}
cpPom ${exampleAlarm}
cpPom ${exampleEcho}
cpPom ${exampleHelloworld}
cpPom ${exampleLightswitch}
cpPom ${exampleMinecraft}
cpPom ${examplePhone}
cpPom ${exampleSql}
cpPom ${exampleTime}
cpPom ${exampleWeather}

cp ${exampleMinecraftMod}/build.gradle ${zipDir}/${tmpDir}/${exampleMinecraftMod}

cp pom.xml ${zipDir}/${tmpDir}
cp LICENSE ${zipDir}/${tmpDir}
cp NOTICE ${zipDir}/${tmpDir}
cp assembly.xml ${zipDir}/${tmpDir}
cp README.md ${zipDir}/${tmpDir}
cp javadoc/stylesheet.css ${zipDir}/${tmpDir}/javadoc

# Prepares src zip.
cd ${zipDir} || exit
zip -rq "${zipFileSrc}" ${tmpDir} 2> /dev/null
echo "Source zip created: " "${zipFileSrc}"

rm -R ${tmpDir} 2> /dev/null

function sign() {
  shasum -a 256 "$1" > "$1".sha256
  gpg --local-user ${localUser} --sign --armor --output "$1".asc --detach-sign "$1"
}

sign "${zipFileBin}"
sign "${zipFileSrc}"

cd "${curDir}" || exit

echo
echo "****************************"
echo "ZIPs are prepared in folder: '${zipDir}'"
echo "****************************"