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

CUR_DIR="."
PAR_DIR=".."

# Output files
OUT_ONLY_CUR="compare.only_in_current.txt"
OUT_ONLY_PAR="compare.only_in_parent.txt"
OUT_DIFF="compare.different.txt"
OUT_SUMMARY="compare.summary.txt"

# Temp files for lists
cur_list=$(mktemp)
par_list=$(mktemp)
diff_tmp=$(mktemp)

trap 'rm -f "$cur_list" "$par_list" "$diff_tmp"' EXIT

# List regular files (names only) in each directory
(
  cd "$CUR_DIR"
  for f in *; do
    [ -f "$f" ] && printf '%s\n' "$f"
  done
) | sort > "$cur_list"

(
  cd "$PAR_DIR"
  for f in *; do
    [ -f "$f" ] && printf '%s\n' "$f"
  done
) | sort > "$par_list"

# Files only in current dir (not in parent)
comm -23 "$cur_list" "$par_list" > "$OUT_ONLY_CUR"

# Files only in parent dir (missing in current)
comm -13 "$cur_list" "$par_list" > "$OUT_ONLY_PAR"

# Files in both: check content differences
comm -12 "$cur_list" "$par_list" | while IFS= read -r file; do
  if ! diff -q "$CUR_DIR/$file" "$PAR_DIR/$file" >/dev/null 2>&1; then
    printf '%s\n' "$file"
  fi
done > "$OUT_DIFF"

# Counts
count_cur=$(wc -l < "$cur_list" | tr -d ' ')
count_par=$(wc -l < "$par_list" | tr -d ' ')
count_only_cur=$(wc -l < "$OUT_ONLY_CUR" | tr -d ' ')
count_only_par=$(wc -l < "$OUT_ONLY_PAR" | tr -d ' ')
count_diff=$(wc -l < "$OUT_DIFF" | tr -d ' ')

# Build column-aligned summary report
{
  printf '%s\n' "=== Directory comparison report ==="
  printf '%-25s %s\n' "Current dir ($CUR_DIR):" "$count_cur files"
  printf '%-25s %s\n' "Parent dir  ($PAR_DIR):" "$count_par files"
  printf '\n'

  printf '%-30s %s\n' "Category" "Count"
  printf '%-30s %s\n' "------------------------------" "-----"
  printf '%-30s %s\n' "Only in current dir" "$count_only_cur"
  printf '%-30s %s\n' "Only in parent dir (missing)" "$count_only_par"
  printf '%-30s %s\n' "Different in both dirs" "$count_diff"
  printf '\n'

  printf '%s\n' "Files only in current dir (not missing from parent):"
  printf '%-30s %s\n' "See file:" "$OUT_ONLY_CUR"
  if [ -s "$OUT_ONLY_CUR" ]; then
    cat "$OUT_ONLY_CUR"
  else
    printf '%s\n' "(none)"
  fi
  printf '\n'

  printf '%s\n' "Files only in parent dir (missing in current):"
  printf '%-30s %s\n' "See file:" "$OUT_ONLY_PAR"
  if [ -s "$OUT_ONLY_PAR" ]; then
    cat "$OUT_ONLY_PAR"
  else
    printf '%s\n' "(none)"
  fi
  printf '\n'

  printf '%s\n' "Files present in both but with different content:"
  printf '%-30s %s\n' "See file:" "$OUT_DIFF"
  if [ -s "$OUT_DIFF" ]; then
    cat "$OUT_DIFF"
  else
    printf '%s\n' "(none)"
  fi
} > "$OUT_SUMMARY"

echo "Report written to: $OUT_SUMMARY"
echo "  - $OUT_ONLY_CUR"
echo "  - $OUT_ONLY_PAR"
echo "  - $OUT_DIFF"
