#!/bin/sh
# POSIX read-only naming audit and review-only rename-plan generator.
# Usage: audit.naming.posix.sh APP_NAME [--details] [--summary] [--backup] [--fix]
set -eu
APPS_ROOT=${APPS_ROOT:-/home/intel145/websites/apps}
APP=${1:-}
[ -n "$APP" ] || { echo 'Usage: audit.naming.posix.sh APP_NAME [--details] [--summary] [--backup] [--fix]' >&2; exit 2; }
shift || true
DETAILS=0 SUMMARY=0 BACKUP=0 FIX=0
while [ "$#" -gt 0 ]; do
    case "$1" in
        --details) DETAILS=1 ;;
        --summary) SUMMARY=1 ;;
        --backup) BACKUP=1 ;;
        --fix) FIX=1 ;;
        -h|--help)
            cat <<'EOF'
Usage: audit.naming.posix.sh APP_NAME [--details] [--summary] [--backup] [--fix]

Naming policy:
  Files: lowercase letters and digits in base name only; no '-' or '_'.
  Directories: lowercase letters, digits, and '_' only; no '-' or '.'.
  --fix generates a commented review-only rename.APP_NAME.sh plan.
EOF
            exit 0 ;;
        *) echo "ERROR: unknown option: $1" >&2; exit 2 ;;
    esac
    shift
done
case "$APP" in *[!A-Za-z0-9_-]*|'') echo 'ERROR: invalid app name.' >&2; exit 2;; esac
[ -d "$APPS_ROOT" ] || { echo "ERROR: APPS_ROOT does not exist: $APPS_ROOT" >&2; exit 2; }
ROOT=$(cd "$APPS_ROOT" && pwd -P)
APPDIR=$APPS_ROOT/$APP
[ -d "$APPDIR" ] || { echo "ERROR: app directory does not exist: $APPDIR" >&2; exit 2; }
APPREAL=$(cd "$APPDIR" && pwd -P)
case "$APPREAL/" in "$ROOT/"*) ;; *) echo 'ERROR: app path escapes APPS_ROOT.' >&2; exit 2;; esac
TMP=${TMPDIR:-/tmp}/audit_naming_$$
trap 'rm -f "$TMP" "$TMP.files" "$TMP.dirs" "$TMP.backups" "$TMP.plan"' EXIT HUP INT TERM
: > "$TMP"; : > "$TMP.files"; : > "$TMP.dirs"; : > "$TMP.backups"; : > "$TMP.plan"
file_count=0; dir_count=0; backup_count=0
suggest_file() { p=$1; dir=${p%/*}; n=${p##*/}; case "$n" in *.*) base=${n%.*}; ext=.${n##*.};; *) base=$n; ext=;; esac; target=$(printf '%s' "$base" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9'); printf '%s/%s%s\n' "$dir" "$target" "$ext"; }
suggest_dir() { p=$1; dir=${p%/*}; n=${p##*/}; target=$(printf '%s' "$n" | tr '[:upper:]' '[:lower:]' | tr '-' '_' | tr -cd 'a-z0-9_'); printf '%s/%s\n' "$dir" "$target"; }
find "$APPREAL" -type f -print | while IFS= read -r p; do
    rel=${p#"$APPREAL"/}; n=${p##*/}; case "$n" in *.*) base=${n%.*};; *) base=$n;; esac
    case "$base" in *[!a-z0-9]*) printf 'FILE|%s|%s\n' "$rel" "$(suggest_file "$p" | sed "s#^$APPREAL/##")" >> "$TMP.files";; esac
done
find "$APPREAL" -type d -print | while IFS= read -r p; do
    [ "$p" = "$APPREAL" ] && continue; rel=${p#"$APPREAL"/}; n=${p##*/}
    case "$n" in *[!a-z0-9_]*) printf 'DIR|%s|%s\n' "$rel" "$(suggest_dir "$p" | sed "s#^$APPREAL/##")" >> "$TMP.dirs";; esac
done
if [ "$BACKUP" -eq 1 ]; then find "$APPREAL" -type f \( -name '*.bak' -o -name '*.backup' -o -name '*~' -o -name '*.swp' \) -print | while IFS= read -r p; do printf 'BACKUP|%s|move outside served app root or delete after review\n' "${p#"$APPREAL"/}" >> "$TMP.backups"; done; fi
file_count=$(wc -l < "$TMP.files" | tr -d ' '); dir_count=$(wc -l < "$TMP.dirs" | tr -d ' '); backup_count=$(wc -l < "$TMP.backups" | tr -d ' ')
printf 'POSIX naming audit\nApp: %s\nRoot: %s\n\n' "$APP" "$APPREAL"
[ "$file_count" -eq 0 ] && echo 'PASS    NAME-FILE: file base names comply.' || echo "WARN    NAME-FILE: $file_count file names violate lowercase/no-hyphen/no-underscore policy."
[ "$dir_count" -eq 0 ] && echo 'PASS    NAME-DIR: directory names comply.' || echo "WARN    NAME-DIR: $dir_count directory names violate lowercase/underscore-only policy."
[ "$BACKUP" -eq 1 ] && echo "INFO    BACKUP: $backup_count backup/editor residue files found."
if [ "$DETAILS" -eq 1 ]; then
    echo ''; echo 'Details'; echo '-------'
    cat "$TMP.files" "$TMP.dirs" "$TMP.backups" 2>/dev/null | while IFS='|' read -r kind src dst; do
        case "$kind" in FILE) printf '[NAME-FILE] %s -> %s\n' "$src" "$dst";; DIR) printf '[NAME-DIR]  %s -> %s\n' "$src" "$dst";; BACKUP) printf '[BACKUP]    %s -> %s\n' "$src" "$dst";; esac
    done
fi
if [ "$FIX" -eq 1 ]; then
    plan="$(pwd)/rename.$APP.sh"
    {
      echo '#!/bin/sh'
      echo '# REVIEW BEFORE RUNNING. This generated plan is intentionally commented out.'
      echo '# Update PHP includes/requires, HTML URLs, CSS/JS references, and imports first.'
      printf 'cd %s\n' "$(printf '%s' "$APPREAL" | sed "s/'/'\\''/g")"
      cat "$TMP.files" "$TMP.dirs" | while IFS='|' read -r kind src dst; do printf '# REVIEW: mv -- %s %s\n' "$(printf '%s' "$src" | sed 's/ /\\ /g')" "$(printf '%s' "$dst" | sed 's/ /\\ /g')"; done
    } > "$plan"
    chmod 0700 "$plan"
    echo "Plan written for review: $plan"
fi
[ "$SUMMARY" -eq 1 ] && printf '\nSummary: file_violations=%s directory_violations=%s backup_findings=%s\n' "$file_count" "$dir_count" "$backup_count"
[ "$file_count" -eq 0 ] && [ "$dir_count" -eq 0 ] || exit 1
