#!/bin/bash

SHELL_CMD='/usr/share/zentyal/shell'
LK_REGEX="^[A-Z0-9]{5}-[A-Z0-9]{5}.[A-Z0-9]{5}-[A-Z0-9]{5}$"

# Get the license key from Redis
LK=$($SHELL_CMD '$global->getLicenseData("license_key")' 2>/dev/null)

if [[ -z "$LK" ]] || ! echo "$LK" | grep -qE "$LK_REGEX"; then
	logger UCP[$$] INFO: No valid license key found in Redis.
	exit 0
fi

RESPONSE_DATA_FILE_TMP=$(mktemp /tmp/XXXXXXX)

# Preparing the data with JSON encoding for API v2
JSON_STRING=$( jq -n \
                  --arg lk "$LK" \
                  '{
                      license_key: $lk
                    }' 
            )

# Run the request to "check the license status" (API v2)
HTTP_CODE=$(/usr/bin/timeout 30 /usr/bin/curl --silent -X POST -H "Content-Type: application/json" -d "$JSON_STRING" https://ucp.zentyal.com/api/v2/licenses/status -w "%{http_code}" -o $RESPONSE_DATA_FILE_TMP)
CURL_EXIT=$?

# Check if timeout occurred
if [ $CURL_EXIT -eq 124 ]; then
	logger UCP[$$] ERROR: Connection timeout while checking license status.
	rm -f $RESPONSE_DATA_FILE_TMP
	exit 0
fi

if [ "$HTTP_CODE" -eq "200" ]; then
	# Parse v2 status response
	STATUS_CODE=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".status_code")
	LK_DATA=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".data")
	METADATA=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".metadata")

	LK_CODE=$(echo $LK_DATA | jq -r ".code")
	LK_EXPIRATION=$(echo $LK_DATA | jq -r ".expiration_date")
	LK_TYPE=$(echo $LK_DATA | jq -r ".license_type.code")
	LK_USERS=$(echo $LK_DATA | jq -r ".users")
	LK_STATUS_CODE=$(echo $LK_DATA | jq -r ".status.code")
	LK_STATUS_LABEL=$(echo $LK_DATA | jq -r ".status.label")
	SERVER_HASH=$(echo $LK_DATA | jq -r ".server_hash // empty")

	# Get OAuth credentials
	OAUTH_DATA=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".oauth_client")
	UCP_CLIENT_ID=$(echo $OAUTH_DATA | jq -r ".id // empty")
	UCP_CLIENT_SECRET=$(echo $OAUTH_DATA | jq -r ".secret // empty")

	# Read server_uuid from the file saved during activation
	SRV_UUID=''
	if [ -f /var/lib/zentyal/.product_uuid ]; then
		SRV_UUID=$(cat /var/lib/zentyal/.product_uuid)
	fi

	# Save all license data to Redis via helper script (avoids shell escaping issues)
	jq -n \
		--arg lk "$LK_CODE" \
		--arg lt "$LK_TYPE" \
		--arg exp "$LK_EXPIRATION" \
		--arg usr "$LK_USERS" \
		--arg sc "$LK_STATUS_CODE" \
		--arg sl "$LK_STATUS_LABEL" \
		--arg sh "$SERVER_HASH" \
		--arg ci "$UCP_CLIENT_ID" \
		--arg cs "$UCP_CLIENT_SECRET" \
		--arg su "$SRV_UUID" \
		'{
			license_key: $lk,
			license_type: $lt,
			expiration_date: $exp,
			users: $usr,
			status_code: $sc,
			status_label: $sl,
			server_hash: $sh,
			ucp_client_id: $ci,
			ucp_client_secret: $cs,
			server_uuid: $su
		}' | /usr/share/zentyal/save-license-data

	touch /var/lib/zentyal/.commercial-edition

	# exit codes according to v2 status_code
	case "$STATUS_CODE" in
		"ACTIVE")
			logger UCP[$$] INFO: License key $LK_CODE is active and valid.
			rm -f $RESPONSE_DATA_FILE_TMP
			exit 0
			;;
		"INACTIVE")
			logger UCP[$$] INFO: License key $LK_CODE is inactive but valid.
			rm -f $RESPONSE_DATA_FILE_TMP
			exit 0
			;;
		"EXPIRED")
			if [ "$LK_TYPE" == "TR" ]; then
				logger UCP[$$] INFO: Trial license $LK_CODE has expired. Stopping webadmin.
				rm -f $RESPONSE_DATA_FILE_TMP
				exit 1
			else
				logger UCP[$$] INFO: License key $LK_CODE has expired.
				rm -f $RESPONSE_DATA_FILE_TMP
				exit 77
			fi
			;;
		"DISABLED")
			logger UCP[$$] INFO: License key $LK_CODE is disabled.
			rm -f $RESPONSE_DATA_FILE_TMP
			exit 77
			;;
		"CANCELLED")
			logger UCP[$$] INFO: License key $LK_CODE is cancelled.
			rm -f $RESPONSE_DATA_FILE_TMP
			exit 77
			;;
		"DUPLICATED")
			logger UCP[$$] INFO: License key $LK_CODE is duplicated.
			rm -f $RESPONSE_DATA_FILE_TMP
			exit 77
			;;
		*)
			logger UCP[$$] INFO: "License key status is unknown: $STATUS_CODE, nothing to do."
			rm -f $RESPONSE_DATA_FILE_TMP
			exit 1
			;;
	esac

elif [ "$HTTP_CODE" -eq "404" ]; then
	ERROR_CODE=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".error_code // empty")
	RES_MSG=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".message // empty")
	logger UCP[$$] ERROR: License not found [$ERROR_CODE]: $RES_MSG
	rm -f $RESPONSE_DATA_FILE_TMP
	exit 77
else
	RES_MSG=$(cat $RESPONSE_DATA_FILE_TMP | jq -r ".message // empty")
	logger UCP[$$] ERROR: The connection with UCP cannot be established or the service is not available. $RES_MSG
	rm -f $RESPONSE_DATA_FILE_TMP
	exit 0
fi