#!/usr/bin/env bash
set -euo pipefail

tool_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
workspace_dir="$(cd "$tool_dir/../.." && pwd)"
target_dir="$workspace_dir/sanctuary/src/main/resources/assets/minecraft/textures/gui/title/background"
default_instance="$HOME/Library/Application Support/PrismLauncher/instances/sanctuary-26.2.0-alpha.1-local/minecraft"
instance_minecraft="${SANCTUARY_INSTANCE_MINECRAFT:-$default_instance}"

usage() {
	printf '%s\n' \
		"Sanctuary panorama tool" \
		"" \
		"In game:" \
		"  /masterkey panorama capture" \
		"  /masterkey panorama folder" \
		"" \
		"In this terminal:" \
		"  ./masterkey/tools/panorama list" \
		"  ./masterkey/tools/panorama open [latest|CAPTURE]" \
		"  ./masterkey/tools/panorama check [latest|CAPTURE]" \
		"  ./masterkey/tools/panorama apply [latest|CAPTURE] [--source-only]"
}

capture_roots() {
	if [[ -n "${SANCTUARY_CAPTURE_ROOT:-}" ]]; then
		printf '%s\n' "$SANCTUARY_CAPTURE_ROOT"
	fi
	printf '%s\n' "$instance_minecraft/screenshots/sanctuary-panorama"
	printf '%s\n' "$workspace_dir/masterkey/run/screenshots/sanctuary-panorama"
}

capture_directories() {
	while IFS= read -r root; do
		[[ -d "$root" ]] || continue
		find "$root" -mindepth 1 -maxdepth 1 -type d -print
	done < <(capture_roots)
}

latest_capture() {
	local latest
	latest="$(capture_directories | while IFS= read -r directory; do
		stat -f '%m %N' "$directory"
	done | sort -rn | head -n 1 | cut -d' ' -f2-)"
	if [[ -z "$latest" ]]; then
		printf 'Aucune capture Sanctuary trouvée. Utilisez /masterkey panorama capture.\n' >&2
		exit 1
	fi
	printf '%s\n' "$latest"
}

resolve_capture() {
	local requested="${1:-latest}"
	if [[ "$requested" == "latest" ]]; then
		latest_capture
	elif [[ -d "$requested" ]]; then
		cd "$requested" && pwd
	else
		local match=""
		while IFS= read -r directory; do
			if [[ "$(basename "$directory")" == "$requested" ]]; then
				match="$directory"
				break
			fi
		done < <(capture_directories)
		if [[ -z "$match" ]]; then
			printf 'Capture introuvable : %s\n' "$requested" >&2
			exit 1
		fi
		printf '%s\n' "$match"
	fi
}

check_capture() {
	local capture_dir="$1"
	python3 - "$capture_dir" <<'PY'
import json
import struct
import sys
from pathlib import Path

root = Path(sys.argv[1])
missing = []
invalid = []
for family in ("panorama", "depth", "depth_raw"):
    for face in range(6):
        path = root / f"{family}_{face}.png"
        if not path.is_file():
            missing.append(path.name)
            continue
        with path.open("rb") as stream:
            header = stream.read(24)
        if len(header) != 24 or header[:8] != b"\x89PNG\r\n\x1a\n":
            invalid.append(f"{path.name}: not a PNG")
            continue
        width, height = struct.unpack(">II", header[16:24])
        if (width, height) != (1024, 1024):
            invalid.append(f"{path.name}: {width}x{height}, expected 1024x1024")
metadata = root / "capture.json"
if not metadata.is_file():
    missing.append(metadata.name)
else:
    with metadata.open(encoding="utf-8") as stream:
        document = json.load(stream)
    if document.get("format") != "sanctuary.panorama.capture.v1":
        invalid.append("capture.json: unsupported format")
if missing or invalid:
    for issue in missing:
        print(f"missing: {issue}", file=sys.stderr)
    for issue in invalid:
        print(f"invalid: {issue}", file=sys.stderr)
    raise SystemExit(1)
print(f"Capture valide : {root}")
print("6 faces couleur + 6 profondeurs linéaires + 6 buffers reverse-Z bruts")
PY
}

command="${1:-help}"
case "$command" in
	help|-h|--help)
		usage
		;;
	list)
		if ! capture_directories | sort -r; then
			exit 1
		fi
		;;
	open)
		capture_dir="$(resolve_capture "${2:-latest}")"
		open "$capture_dir"
		printf 'Ouvert dans le Finder : %s\n' "$capture_dir"
		;;
	check)
		capture_dir="$(resolve_capture "${2:-latest}")"
		check_capture "$capture_dir"
		;;
	apply)
		capture_dir="$(resolve_capture "${2:-latest}")"
		mode="${3:-}"
		if [[ -n "$mode" && "$mode" != "--source-only" ]]; then
			printf 'Option inconnue : %s\n' "$mode" >&2
			exit 2
		fi
		check_capture "$capture_dir"
		stamp="$(date -u '+%Y%m%d-%H%M%S')"
		backup_dir="$workspace_dir/build/panorama-backups/$stamp"
		mkdir -p "$backup_dir" "$target_dir"
		for face in 0 1 2 3 4 5; do
			if [[ -f "$target_dir/panorama_${face}.png" ]]; then
				cp "$target_dir/panorama_${face}.png" "$backup_dir/panorama_${face}.png"
			fi
			cp "$capture_dir/panorama_${face}.png" "$target_dir/panorama_${face}.png"
		done
		printf 'Panorama source mis à jour. Sauvegarde : %s\n' "$backup_dir"
		(
			cd "$workspace_dir"
			./gradlew :sanctuary:build
		)
		if [[ "$mode" == "--source-only" ]]; then
			printf 'Build terminé sans installation Prism (--source-only).\n'
			exit 0
		fi
		if [[ ! -d "$instance_minecraft/mods" ]]; then
			printf 'Instance Prism absente; le JAR est construit mais non installé : %s\n' "$instance_minecraft" >&2
			exit 0
		fi
		version="$(sed -n 's/^sanctuary_version=//p' "$workspace_dir/gradle.properties")"
		built_jar="$workspace_dir/sanctuary/build/libs/sanctuary-${version}.jar"
		if [[ ! -f "$built_jar" ]]; then
			printf 'JAR Sanctuary construit introuvable : %s\n' "$built_jar" >&2
			exit 1
		fi
		jar_backup="$instance_minecraft/mods-backup/panorama-$stamp"
		mkdir -p "$jar_backup"
		while IFS= read -r installed; do
			[[ -f "$installed" ]] || continue
			mv "$installed" "$jar_backup/$(basename "$installed")"
		done < <(find "$instance_minecraft/mods" -maxdepth 1 -type f -name 'sanctuary-*.jar' -print)
		cp "$built_jar" "$instance_minecraft/mods/$(basename "$built_jar")"
		printf 'Fond installé dans Prism. Ancien JAR : %s\n' "$jar_backup"
		;;
	*)
		printf 'Commande inconnue : %s\n\n' "$command" >&2
		usage >&2
		exit 2
		;;
esac
