#!/bin/sh
# ====================================================================
# Copyright (c) 2014 Obeo
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#    Obeo - initial API and implementation
# ====================================================================

_retrieveZippedArtifact() {
	local artifactURL="${1}"
	local localArtifact="${2}"
	local unzipTo="${3}"

	curl -s -k "${artifactURL}" > "${localArtifact}"

	if [ -d "${unzipTo}" ]; then
		rm -rf "${unzipTo}"
	fi
	unzip -qq "${localArtifact}" -d "${unzipTo}"
}

_updateLatestUpdateSite() {
	local updateHome="${1}"
    local stream="${2}"
    local latestRepoLabel="${3}"

    local currentPwd=$(pwd)
    cd "${updateHome}"
    local updateSitesInStream=( $(echo "${stream}"* | tr ' ' '\n' | grep -E '[0-9]+\.[0-9]+\.[0-9]+.*' || true) )    
    cd "${currentPwd}"

    if [ ${#updateSitesInStream[@]} -gt 0 ]; then
    	local absolutePathToLatest=$( streamLatestAbsolutePath "${updateHome}" "${stream}" )
        local latestUpdateSite=$( echo ${updateSitesInStream[@]} | tr ' ' '\n' | sort | tail -n 1 )
        local relpath=$( relativize ${absolutePathToLatest} ${updateHome}/${latestUpdateSite} )
        LSINFO "Creating redirection from '${absolutePathToLatest}' to '${relpath}'" 
        createRedirect "${absolutePathToLatest}" "${relpath}" "${latestRepoLabel}"
    else
        LSINFO "No folder in '${updateHome}' have a name that start with '${stream}' and that match the regex '[0-9]+\.[0-9]+\.[0-9]+.*'."
    fi
}

_publishUpdateSiteInStream() {
	local updateHome="${1}"
	local projectName="${2}"
	local category="${3}"
	local qualifiedVersion="${4}"
	local stream="${5}"

	local _streamAbsolutePath=$( streamAbsolutePath "${updateHome}" "${stream}" )
	local relativePathToUpdateSite=$( relativize "${_streamAbsolutePath}" "${updateHome}/${qualifiedVersion}" )

	LSINFO "Adding '${relativePathToUpdateSite}' to composite repository '$(streamLabel "${stream}")'"
	compositeRepository \
		-location "${_streamAbsolutePath}" \
		-add "${relativePathToUpdateSite}" \
		-repositoryName $(streamRepositoryLabel "${projectName}" "${category}" "${stream}") \
		-compressed
		createP2Index "${_streamAbsolutePath}"

	LSINFO "Updating latest link of ${category} stream '$(streamLabel "${stream}")'"
	_updateLatestUpdateSite "${updateHome}" "${stream}" $(streamLatestRepositoryLabel "${projectName}" "${category}" "${stream}")
}

publishUpdateSite() {
	local wd="${1}"
	local updateHome="${2}"
	local projectName="${3}"
	local category="${4}"
	local artifactURL="${5}"
	local qualifiedVersion="${6}"

	# the update site
	LSINFO "Downloading '${artifactURL}'"
	local targetUpdateSiteName="update-site-${qualifiedVersion}"
	_retrieveZippedArtifact "${artifactURL}" "${wd}/${targetUpdateSiteName}.zip" "${wd}/${targetUpdateSiteName}"

	if [ ! -d "${updateHome}/${qualifiedVersion}" ]; then
		LSINFO "Creating folder '${updateHome}/${qualifiedVersion}'"
		mkdir -p "${updateHome}/${qualifiedVersion}"
	fi

	LSINFO "Copying update site to '${updateHome}/${qualifiedVersion}'"
	cp -Rf "${wd}/${targetUpdateSiteName}/"* "${updateHome}/${qualifiedVersion}"

	## streams update
	LSINFO "Publishing update site in stream $(streamLabel $(unqualifiedVersion ${qualifiedVersion}))"
	_publishUpdateSiteInStream "${updateHome}" "${projectName}" "${category}" "${qualifiedVersion}" "$(unqualifiedVersion ${qualifiedVersion})"
	LSINFO "Publishing update site in stream $(streamLabel $(minorVersion ${qualifiedVersion}))"
	_publishUpdateSiteInStream "${updateHome}" "${projectName}" "${category}" "${qualifiedVersion}" "$(minorVersion ${qualifiedVersion})"
	LSINFO "Publishing update site in stream $(streamLabel $(majorVersion ${qualifiedVersion}))"
	_publishUpdateSiteInStream "${updateHome}" "${projectName}" "${category}" "${qualifiedVersion}" "$(majorVersion ${qualifiedVersion})"
	LSINFO "Publishing update site in global stream"
	_publishUpdateSiteInStream "${updateHome}" "${projectName}" "${category}" "${qualifiedVersion}" ""
}
