#!/bin/bash

# Colors for output
CYAN='\033[0;36m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NOCOLOR='\033[0m'

# Get the directory where this hook is located
HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Go up from .git/hooks/ to repo root
REPO_ROOT="$(cd "$HOOK_DIR/../.." && pwd)"
CHANGELOG_SCRIPT="$REPO_ROOT/scripts/update_changelog.sh"
PREVIEW_FILE="$REPO_ROOT/.changelog_preview.tmp"
VERSION_FILE="$REPO_ROOT/.changelog_version.tmp"

# Update changelog before push
if [ -f "$CHANGELOG_SCRIPT" ]; then
  echo -e "\n${CYAN}Updating changelog...${NOCOLOR}"
  bash "$CHANGELOG_SCRIPT"
  changelog_status=$?
  if [ $changelog_status -ne 0 ]; then
    echo -e "${RED}Push aborted: changelog update failed.${NOCOLOR}"
    exit 1
  fi
  
  # Show preview if changelog was updated
  if [ -f "$PREVIEW_FILE" ] && [ -f "$VERSION_FILE" ]; then
    NEW_VERSION=$(cat "$VERSION_FILE")
    PREVIEW_CONTENT=$(cat "$PREVIEW_FILE")
    
    echo ""
    echo -e "${BLUE}========================================================================${NOCOLOR}"
    echo -e "${CYAN}                    CHANGELOG PREVIEW${NOCOLOR}"
    echo -e "${BLUE}========================================================================${NOCOLOR}"
    echo ""
    echo -e "${GREEN}New Version: ${YELLOW}$NEW_VERSION${NOCOLOR}"
    echo ""
    echo -e "${CYAN}Changelog Entry:${NOCOLOR}"
    echo -e "${BLUE}────────────────────────────────────────────────────────────────────────${NOCOLOR}"
    echo -e "$PREVIEW_CONTENT"
    echo -e "${BLUE}────────────────────────────────────────────────────────────────────────${NOCOLOR}"
    echo ""
    echo -e "${YELLOW}Do you want to proceed with the push? (yes/no):${NOCOLOR} "
    # Read from /dev/tty to ensure we can read from terminal even in git hook context
    read -r confirmation < /dev/tty
    
    if [ "$confirmation" != "yes" ]; then
      echo -e "${RED}Push aborted by user.${NOCOLOR}"
      echo -e "${YELLOW}To revert changes, run:${NOCOLOR}"
      echo -e "  git checkout CHANGELOG.md Makefile"
      # Clean up temp files
      rm -f "$PREVIEW_FILE" "$VERSION_FILE"
      exit 1
    fi
    
    echo -e "${GREEN}Proceeding with push...${NOCOLOR}"
    
    # Commit the updated CHANGELOG.md and Makefile
    cd "$REPO_ROOT"
    echo -e "${CYAN}Staging CHANGELOG.md and Makefile...${NOCOLOR}"
    git add CHANGELOG.md Makefile
    
    echo -e "${CYAN}Committing changes...${NOCOLOR}"
    NEW_VERSION=$(cat "$VERSION_FILE")
    git commit -m "chore: update changelog and version to $NEW_VERSION" || {
      # If commit fails (e.g., no changes to commit), continue anyway
      echo -e "${YELLOW}Note: Could not commit changes (may already be committed)${NOCOLOR}"
    }
    
    # Clean up temp files
    rm -f "$PREVIEW_FILE" "$VERSION_FILE"
  fi
else
  echo -e "${YELLOW}Warning: changelog update script not found at $CHANGELOG_SCRIPT${NOCOLOR}"
fi

echo -e "\n${CYAN}Running tests...${NOCOLOR}"
go test ./...   # Runs all tests in your repo
status=$?
if [ $status -ne 0 ]; then
  echo -e "${RED}Push aborted: some tests failed.${NOCOLOR}"
  exit 1
else
  echo -e "${GREEN}All tests passed. Proceeding with push.${NOCOLOR}"
fi
