#!/bin/zsh -Ndefgku

# Copyright © 2026 mas-cli. All rights reserved.

builtin unalias -as
setopt pipefail

path_or_simple_command() {
	# shellcheck disable=SC2139
	[[ -x "${1}" ]] && printf %s "${1}" || printf %s "${1:t}"
}

readonly mas="${0:A:h}/../libexec/bin/mas"
# shellcheck disable=SC2311
jq="$(path_or_simple_command /usr/bin/jq)"
readonly jq

[[ -t 2 ]] && readonly error_prefix=$'\u001B[4;31mError:\u001B[0m' || readonly error_prefix=Error:

# shellcheck disable=SC1072,SC1073
case "${1:-}" in
outdated)
	readonly max_version_length_jq=$'\n\t(map(.version // "" | length) | max) as $max_version_length |'
	readonly new_version_jq=$' + ($version | pad_spaces($max_version_length)) + " -> " + .newVersion'
	;|
search)
	[[ -n ${argv[(r)--price]-} ]] && readonly output_price=' + [.formattedPrice // .price // "?"]'
	;&
list|outdated)
	# shellcheck disable=SC1056
	{
		# shellcheck disable=SC1083
		{ exec "${mas}" "${@}" 3>&1 1>&4 2>&5 } | "${jq}" -sr '
def pad_spaces($count):
	" " * ($count - (. | length))
;
try (
	(map(.adamID | tostring | length) | max) as $max_adam_id_length |'"${max_version_length_jq-}"'
	.[] |
	(.adamID | tostring) as $adam_id |
	(.version // "") as $version |
	[
		($adam_id | pad_spaces($max_adam_id_length)) + $adam_id,
		.name,
		"(" + $version'"${new_version_jq-}"' + ")"
	]'"${output_price-}"' |
	join("\u001f")
) catch ("'"${error_prefix}"' Invalid JSON: \(.)\n" | halt_error(1))
' | /usr/bin/column -ts $'\u001f'
	} 4>&1 5>&2
	;;
lookup|info)
	{
		{ exec "${mas}" "${@}" 3>&1 1>&4 2>&5 } | "${jq}" -sr '
def number_commas($n):
	($n | abs | round | tostring) as $s |
	if $n < 0 then "-" else "" end + ([$s | while(length > 0; .[:-3]) | .[-3:]] | reverse | join(","))
;
try (
	{
		"name": "App",
		"version": "Version",
		"formattedPrice": "Price",
		"sellerName": "By",
		"currentVersionReleaseDate": "Released",
		"minimumOSVersion": "Minimum OS",
		"fileSizeBytes": "Size",
		"appStorePageURL": "From"
	} as $key_map |
	($key_map | values | map(length) | max) as $max_key_length |
	[
		.[]? as $in |
		[
			($key_map | keys_unsorted)[] |
			select($in[.] != null) as $k |
			"\($key_map[$k]) \("▁" * ($max_key_length - ($key_map[$k] | length) + 1)) \(
				$in[$k] |
				if $k == "fileSizeBytes" then
					number_commas(tonumber? / 1e6 // 0) + " MB"
				elif $k == "currentVersionReleaseDate" then
					(fromdateiso8601? | strflocaltime("%Y-%m-%d")) // .
				else
					.
				end
			)"
		] |
		join("\n")
	] |
	map(select(length > 0)) | if length > 0 then join("\n\n") else empty end
) catch ("'"${error_prefix}"' Invalid JSON: \(.)\n" | halt_error(1))
'
	} 4>&1 5>&2
	;;
config)
	{
		{ exec "${mas}" "${@}" 3>&1 1>&4 2>&5 } | "${jq}" -r '
try (
	(keys_unsorted | map(length) | max) as $max_key_length |
	to_entries[] |
	"\(.key) \("▁" * ($max_key_length - (.key | length) + 1)) \(.value)"
) catch ("'"${error_prefix}"' Invalid JSON: \(.)\n" | halt_error(1))
'
	} 4>&1 5>&2
	;;
*)
	exec "${mas}" "${@}"
	;;
esac
