#!/bin/bash
# filepath: cleanup-alias-tracking.sh

# Cleanup script for removing my-aliases.zsh from git tracking
# This script handles the repository cleanup needed after the alias file
# was changed from tracked to dynamically generated

set -e

# Colors for output - use printf instead of echo -e for better compatibility
print_color() {
    local color="$1"
    local message="$2"
    case "$color" in
        "green")  printf '\033[0;32m%s\033[0m\n' "$message" ;;
        "yellow") printf '\033[1;33m%s\033[0m\n' "$message" ;;
        "red")    printf '\033[0;31m%s\033[0m\n' "$message" ;;
        "blue")   printf '\033[0;34m%s\033[0m\n' "$message" ;;
        *)        printf '%s\n' "$message" ;;
    esac
}

# Script directory and repository root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$SCRIPT_DIR"

print_color "blue" "=== Alias File Tracking Cleanup Script ==="
print_color "yellow" "This script will remove my-aliases.zsh from git tracking"
print_color "yellow" "and update .gitignore to prevent future conflicts."
echo ""

# Verify we're in a git repository
if [ ! -d "$REPO_ROOT/.git" ]; then
    print_color "red" "Error: Not in a git repository"
    echo "Please run this script from the root of your shell repository"
    exit 1
fi

# Change to repository root
cd "$REPO_ROOT"

# Check current git status
print_color "blue" "=== Current Git Status ==="
git status --porcelain

# Check if my-aliases.zsh is currently tracked
if git ls-files --error-unmatch dotfiles/my-aliases.zsh >/dev/null 2>&1; then
    print_color "yellow" "my-aliases.zsh is currently tracked by git"
    ALIASES_TRACKED=true
else
    print_color "green" "my-aliases.zsh is already untracked"
    ALIASES_TRACKED=false
fi

# Check if .gitignore already has the entry
if grep -q "dotfiles/my-aliases.zsh" .gitignore 2>/dev/null; then
    print_color "green" ".gitignore already contains entry for my-aliases.zsh"
    GITIGNORE_UPDATED=true
else
    print_color "yellow" ".gitignore needs to be updated"
    GITIGNORE_UPDATED=false
fi

# Prompt for confirmation
echo ""
print_color "yellow" "Actions that will be performed:"
if [ "$ALIASES_TRACKED" = true ]; then
    echo "  1. Remove dotfiles/my-aliases.zsh from git tracking"
fi
if [ "$GITIGNORE_UPDATED" = false ]; then
    echo "  2. Add dotfiles/my-aliases.zsh to .gitignore"
fi
if [ "$ALIASES_TRACKED" = true ] || [ "$GITIGNORE_UPDATED" = false ]; then
    echo "  3. Commit the changes"
else
    echo "  → No changes needed - cleanup already complete"
fi

echo ""
read -p "Continue? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    print_color "yellow" "Cleanup cancelled"
    exit 0
fi

# Step 1: Remove from git tracking if needed
if [ "$ALIASES_TRACKED" = true ]; then
    print_color "blue" "=== Removing my-aliases.zsh from git tracking ==="

    # Check if file exists and remove from tracking
    if [ -f "dotfiles/my-aliases.zsh" ]; then
        git rm --cached dotfiles/my-aliases.zsh
        print_color "green" "✓ Removed dotfiles/my-aliases.zsh from git tracking"
    else
        # File doesn't exist but is tracked - remove from index anyway
        git rm --cached dotfiles/my-aliases.zsh 2>/dev/null || true
        print_color "green" "✓ Removed non-existent dotfiles/my-aliases.zsh from git index"
    fi
fi

# Step 2: Update .gitignore if needed
if [ "$GITIGNORE_UPDATED" = false ]; then
    print_color "blue" "=== Updating .gitignore ==="

    # Check if the "Generated dotfiles" section already exists
    if grep -q "Generated dotfiles" .gitignore 2>/dev/null; then
        # Add to existing section
        if ! grep -q "dotfiles/my-aliases.zsh" .gitignore; then
            sed -i '/# Generated dotfiles/a dotfiles/my-aliases.zsh' .gitignore
            print_color "green" "✓ Added entry to existing Generated dotfiles section"
        fi
    else
        # Create new section
        echo "" >> .gitignore
        echo "# Generated dotfiles - these are created dynamically by bootstrap process" >> .gitignore
        echo "dotfiles/my-aliases.zsh" >> .gitignore
        print_color "green" "✓ Added new Generated dotfiles section to .gitignore"
    fi
fi

# Step 3: Check if we have changes to commit
if git diff --cached --quiet && git diff --quiet; then
    print_color "green" "=== No changes to commit - cleanup already complete ==="
else
    print_color "blue" "=== Committing changes ==="

    # Add .gitignore changes if any
    git add .gitignore

    # Create commit message
    COMMIT_MSG="Remove my-aliases.zsh from tracking, add to .gitignore

- Remove dotfiles/my-aliases.zsh from git tracking to prevent conflicts
- Add to .gitignore as it's now dynamically generated by bootstrap
- Aliases are now created from my-aliases.zsh.original template"

    # Commit the changes
    git commit -m "$COMMIT_MSG"
    print_color "green" "✓ Changes committed successfully"
fi

# Step 4: Verify the cleanup
print_color "blue" "=== Verification ==="

# Check that file is no longer tracked
if ! git ls-files --error-unmatch dotfiles/my-aliases.zsh >/dev/null 2>&1; then
    print_color "green" "✓ dotfiles/my-aliases.zsh is no longer tracked"
else
    print_color "red" "✗ dotfiles/my-aliases.zsh is still tracked"
fi

# Check that .gitignore contains the entry
if grep -q "dotfiles/my-aliases.zsh" .gitignore; then
    print_color "green" "✓ .gitignore contains entry for dotfiles/my-aliases.zsh"
else
    print_color "red" "✗ .gitignore missing entry for dotfiles/my-aliases.zsh"
fi

# Show final git status
print_color "blue" "=== Final Git Status ==="
git status --porcelain

# Check if we need to push
if git log --oneline origin/main..HEAD 2>/dev/null | grep -q "Remove my-aliases.zsh"; then
    echo ""
    print_color "yellow" "=== Push Required ==="
    print_color "yellow" "You have local commits that need to be pushed to the remote repository."
    printf "Run: \033[0;34mgit push origin main\033[0m\n"
elif ! git remote >/dev/null 2>&1; then
    print_color "yellow" "No remote repository configured"
else
    print_color "green" "Repository is up to date with remote"
fi

echo ""
print_color "green" "=== Cleanup Complete! ==="
print_color "green" "The my-aliases.zsh file is now properly configured as a generated file."
echo ""
print_color "yellow" "Next steps:"
printf "1. Push changes if needed: \033[0;34mgit push origin main\033[0m\n"
echo "2. Run bootstrap/setup on this system to regenerate aliases"
echo "3. The aliases file will now be created dynamically without git conflicts"
