#!/bin/bash
# ------------------------------------------------------------------
# Author: ChatGPT
# Generated on: $(date '+%Y-%m-%d')
#
# This script deletes existing README files matching "* - README.md"
# and then recursively creates a table-of-contents README file in
# each directory. The file is named "Folder Name - README.md".
#
# Each README includes:
#   - An author/date header.
#   - A header with the folder's name.
#   - An alphabetically sorted list of immediate subdirectories,
#     with links to that subdirectory’s own README.
#   - An alphabetically sorted list of immediate files (excluding
#     the generated README).
#
# It is written to handle blank spaces in file and folder names.
# ------------------------------------------------------------------

# Delete any existing README files matching "* - README.md"
find . -type f -name '* - README.md' -delete

# Set the base directory (change "." if necessary)
base_dir="."

# Recursively find every directory starting from base_dir.
find "$base_dir" -type d -print0 | while IFS= read -r -d '' dir; do
    # For the top-level directory, use its actual name rather than "."
    if [ "$dir" = "$base_dir" ]; then
        base=$(basename "$PWD")
    else
        base=$(basename "$dir")
    fi

    # Define the path for the README file: "Folder Name - README.md"
    readme="!$dir/${base} - README.md"

    # Write the header into the README file, including author/date attribution.
    {
      echo ""
      echo "# Table of Contents for ${base}"
      echo ""
    } > "$readme"

    #########################
    # Process Subdirectories
    #########################
    subdirs=()
    # Find immediate subdirectories (depth 1) in the current directory.
    while IFS= read -r -d '' subdir; do
        sub_basename=$(basename "$subdir")
        # Avoid adding empty names.
        if [ -n "$sub_basename" ]; then
            subdirs+=( "$sub_basename" )
        fi
    done < <(find "$dir" -mindepth 1 -maxdepth 1 -type d -print0)

    if [ ${#subdirs[@]} -gt 0 ]; then
        # Sort subdirectory names alphabetically.
        mapfile -t sorted_subdirs < <(printf "%s\n" "${subdirs[@]}" | sort)
        echo "## Subdirectories" >> "$readme"
        for sub in "${sorted_subdirs[@]}"; do
            # Build the line as a variable to avoid printf misinterpreting a leading dash.
            line="- [[${sub}/${sub} - README]]"
            printf "%s\n" "$line" >> "$readme"
        done
        echo "" >> "$readme"
    fi

    #################
    # Process Files
    #################
    files=()
    # Find immediate files (depth 1), excluding the generated README file.
    while IFS= read -r -d '' file; do
        fbase=$(basename "$file")
        if [ -n "$fbase" ]; then
            files+=( "$fbase" )
        fi
    done < <(find "$dir" -mindepth 1 -maxdepth 1 -type f ! -path "$readme" -print0)

    if [ ${#files[@]} -gt 0 ]; then
        # Sort file names alphabetically.
        mapfile -t sorted_files < <(printf "%s\n" "${files[@]}" | sort)
        echo "## Files" >> "$readme"
        for f in "${sorted_files[@]}"; do
            line="- [[${f}]]"
            printf "%s\n" "$line" >> "$readme"
        done
        echo "" >> "$readme"
    fi
done

