#!/usr/bin/env bash
source "$GIT_CONFIG/git.paths.conf"
set -euo pipefail

GIT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

write_file() {
    local path="$1"
    shift
    mkdir -p "$(dirname "$path")"
    cat > "$path" << 'EOF'
EOF
}

# 1) Update requirements doc
cat > "$GIT_ROOT/docs/git.requirements.md" << 'EOF'
Git Utility Requirements Specification
======================================

1. Naming Conventions
---------------------
- Filenames use dot-segment format: git.util.sh, git.sync.v1.sh.
- No underscores in any filenames.
- Directories use lowercase with no underscores.
- Internal functions use CamelCase.
- Scripts must validate naming before execution.

2. Exit Behavior
----------------
- Menu exit keys must be: x or q.
- Numeric exit options are prohibited.
- Scripts must enforce this rule.

3. Directory Layout
-------------------
git/
  bin/            - executable scripts
  config/         - configuration files
  docs/           - documentation
  code/           - code samples
  arch/           - architecture notes
  data/chunks64/  - encoded bundles
  audit/          - audit and enforcement tools

4. Bundle Rules
---------------
- Bundles must be gzip + base64.
- Bundle names: docs.64, code.64, arch.64.
- Decoded files must match:
    docs/docs.txt
    code/code.txt
    arch/arch.txt

5. Metadata Rules
-----------------
- Metadata stored in git.utility.meta.
- Must include version, description, updated timestamp.

6. Audit Rules
--------------
- Naming audit must validate filenames.
- Menu audit must validate exit keys.
- Structure audit must validate directory layout.
- All audits must read rules from external files.

7. Reusability Rules
--------------------
- All audit tools must read rules from:
    config/rules.naming
    config/rules.menu
    config/rules.structure
    config/rules.release
- Rules files must be portable across projects.

End of Specification
EOF

# 2) Update release doc
cat > "$GIT_ROOT/docs/git.release.md" << 'EOF'
Git Utility Release Process
===========================

1. Release Wizard
-----------------
- All releases must be performed via the Release Wizard.
- Manual git commit/tag is prohibited.

2. Release Steps
----------------
- Read existing metadata.
- Prompt for version and description (with defaults).
- Update git.utility.meta.
- Run all audits:
    - validate.naming.sh
    - validate.menu.sh
    - validate.structure.sh
- If audits fail, release is aborted.
- If audits pass:
    - git add .
    - git commit -m "Release <version>"
    - git tag <version>

3. Versioning Rules
-------------------
- Versions use the format: vN (e.g., v1, v2).
- Each release must update git.utility.meta.

End of Release Process
EOF

# 3) Update rules files
cat > "$GIT_ROOT/config/rules.naming" << 'EOF'
no_underscores=true
filename_format=dot-segment
function_format=CamelCase
directory_format=lowercase
EOF

cat > "$GIT_ROOT/config/rules.menu" << 'EOF'
exit_keys=x,q
numeric_exit_disallowed=true
EOF

cat > "$GIT_ROOT/config/rules.structure" << 'EOF'
required_directories=bin,config,docs,code,arch,data/chunks64,audit
required_files=docs/docs.txt,code/code.txt,arch/arch.txt
bundle_directory=data/chunks64
EOF

cat > "$GIT_ROOT/config/rules.release" << 'EOF'
use_release_wizard=true
manual_git_commands_disallowed=true
manual_meta_edit_disallowed=true
EOF

# 4) Regenerate bundles from decoded files
regenerate_bundle() {
    local name="$1"
    local src="$2"
    local dst="$GIT_ROOT/data/chunks64/$name.64"

    if [[ ! -f "$src" ]]; then
        echo "[WARN] Missing source file: $src"
        return
    fi

    mkdir -p "$(dirname "$dst")"
    gzip -c "$src" | base64 > "$dst"
    echo "[OK] Regenerated bundle: $dst"
}

regenerate_bundle "docs" "$GIT_ROOT/docs/docs.txt"
regenerate_bundle "code" "$GIT_ROOT/code/code.txt"
regenerate_bundle "arch" "$GIT_ROOT/arch/arch.txt"

echo "[DONE] Project sync v1 complete."

