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

HERE="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
appTest="${1:-defapp}"

if [[ ! "$appTest" =~ ^[A-Za-z0-9_-]+$ ]]; then
    printf 'Invalid application name: %s\n' "$appTest" >&2
    exit 2
fi

layoutRoot="$(dirname "$(dirname "$HERE")")"
systemConfig="$layoutRoot/system/config/.env"
appConfig="$layoutRoot/system/config/apps/$appTest/.env"

for envFile in "$systemConfig" "$appConfig"; do
    if [[ ! -r "$envFile" ]]; then
        printf 'Missing or unreadable configuration: %s\n' "$envFile" >&2
        exit 2
    fi
done

source "$systemConfig"
source "$appConfig"
set -u

scanRoot="${TRACEFLOW_SCAN_ROOT:-$layoutRoot}"
appsBase="${APPS_BASE:-${APPS_ROOT:-$layoutRoot/apps}}"
appDir="$appsBase/$appTest"
entry="${TRACEFLOW_ENTRY:-$appDir/$appTest.index.php}"

if [[ ! -f "$entry" ]]; then
    printf 'Missing application entry: %s\n' "$entry" >&2
    exit 2
fi

args=(--root "$scanRoot" --entry "$entry")

for name in SYSTEM_ROOT APP_ROOT TEMPLATE_ROOT; do
    value="${!name:-}"
    if [[ -n "$value" ]]; then
        args+=(--constant-path "$name=$value")
    fi
done

cd "$HERE"
mkdir -p storage

printf '\nApplication: %s\nEntry: %s\n\n' "$appTest" "$entry"
python3 src/fileflow.py scan "${args[@]}" --output "storage/$appTest.static.json"
python3 src/fileflow.py tree "${args[@]}" --paths root > "storage/$appTest.detailed.txt"
cat "storage/$appTest.detailed.txt"

entryId="$(python3 - "$scanRoot" "$entry" <<'PY'
from pathlib import Path
import sys
root=Path(sys.argv[1]).resolve(); entry=Path(sys.argv[2]).resolve()
try: print(entry.relative_to(root).as_posix())
except ValueError: print(entry)
PY
)"

printf '\nClean dependency tree:\n\n'
python3 src/clean-tree.py "storage/$appTest.static.json" --entry "$entryId" --output "storage/$appTest.tree.txt"
