#!/bin/bash

# Copyright 2024 The Forgejo Authors. All rights reserved.
# SPDX-License-Identifier: MIT

if [ -z "$1" ] || [ -z "$2" ]
then
	echo "USAGE: $0 section key [key1 [keyN]]"
	exit 1
fi

if ! [ -d ../options/locale_next ]
then
	echo 'Call this script from the `tools` directory.'
	exit 1
fi

destsection="$1"
keyJSON="$destsection.$2"
key1=""
keyN=""
if [ -n "$3" ]
then
	key1="$3"
else
	key1="$2"
fi
if [ -n "$4" ]
then
	keyN="$4"
fi

cd ../options/locale

# Migrate the string in one file.
function process() {
	file="$1"
	exec 3<$file

	val1=""
	valN=""
	cursection=""
	line1=0
	lineN=0
	lineNumber=0

	# Parse the file
	while read -u 3 line
	do
		((++lineNumber))
		if [[ $line =~ ^\[[-._a-zA-Z0-9]+\]$ ]]
		then
			cursection="${line#[}"
			cursection="${cursection%]}"
		elif [ "$cursection" = "$destsection" ]
		then
			key="${line%%=*}"
			value="${line#*=}"
			key="$(echo $key)"  # Trim leading/trailing whitespace
			value="$(echo $value)"

			if [ "$key" = "$key1" ]
			then
				val1="$value"
				line1=$lineNumber
			fi
			if [ -n "$keyN" ] && [ "$key" = "$keyN" ]
			then
				valN="$value"
				lineN=$lineNumber
			fi

			if [ -n "$val1" ] && ( [ -n "$valN" ] || [ -z "$keyN" ] )
			then
				# Found all desired strings
				break
			fi
		fi
	done

	if [ -n "$val1" ] || [ -n "$valN" ]
	then
		localename="${file#locale_}"
		localename="${localename%.ini}"
		localename="${localename%-*}"

		if [ "$file" = "locale_en-US.ini" ]
		then
			# Delete migrated string from source file
			if [ $line1 -gt 0 ] && [ $lineN -gt 0 ] && [ $lineN -ne $line1 ]
			then
				sed -i "${line1}d;${lineN}d" "$file"
			elif [ $line1 -gt 0 ]
			then
				sed -i "${line1}d" "$file"
			elif [ $lineN -gt 0 ]
			then
				sed -i "${lineN}d" "$file"
			fi
		fi

		# Write JSON
		jsonfile="../locale_next/${file/.ini/.json}"

		pluralform="other"
		oneform="one"
		case $localename in
			"be" | "bs" | "cnr" | "csb" | "hr" | "lt" | "pl" | "ru" | "sr" | "szl" | "uk" | "wen")
				# These languages have no "other" form and use "many" instead.
				pluralform="many"
				;;
			"ace" | "ay" | "bm" | "bo" | "cdo" | "cpx" | "crh" | "dz" | "gan" | "hak" | "hnj" | "hsn" | "id" | "ig" | "ii" | "ja" | "jbo" | "jv" | "kde" | "kea" | "km" | "ko" | "kos" | "lkt" | "lo" | "lzh" | "ms" | "my" | "nan" | "nqo" | "osa" | "sah" | "ses" | "sg" | "son" | "su" | "th" | "tlh" | "to" | "tok" | "tpi" | "tt" | "vi" | "wo" | "wuu" | "yo" | "yue" | "zh")
				# These languages have no singular form.
				oneform=""
				;;
			*)
				;;
		esac

		content=""
		if [ -z "$keyN" ]
		then
			content="$(jq --arg val "$val1" ".$keyJSON = \$val" < "$jsonfile")"
		else
			object='{}'
			if [ -n "$val1" ] && [ -n "$oneform" ]
			then
				object=$(jq --arg val "$val1" ".$oneform = \$val" <<< "$object")
			fi
			if [ -n "$valN" ]
			then
				object=$(jq --arg val "$valN" ".$pluralform = \$val" <<< "$object")
			fi
			content="$(jq --argjson val "$object" ".$keyJSON = \$val" < "$jsonfile")"
		fi
		jq . <<< "$content" > "$jsonfile"
	fi
}

for file in *.ini
do
	process "$file" &
done
wait