#!/bin/bash
#
# Post-commit hook: checks release-related tasks after each commit.
# Non-blocking — always exits 0. Just informational.
#
# Outputs a machine-readable checklist so AI agents (Claude Code, etc.)
# can detect pending steps and remind the user proactively.
#

# Colors
CYAN='\033[0;36m'
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
BOLD='\033[1m'

CHECK="${GREEN}✔${NC}"
CROSS="${RED}✘${NC}"

# --- Gather state ---

PKG_VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "unknown")
CLI_VERSION=$(grep -oP '\.version\("\K[^"]+' src/cli.js 2>/dev/null || echo "unknown")
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
TAG_VERSION="${LATEST_TAG#v}"

if [ "$LATEST_TAG" != "none" ]; then
    COMMITS_SINCE_TAG=$(git rev-list "${LATEST_TAG}..HEAD" --count 2>/dev/null || echo "?")
else
    COMMITS_SINCE_TAG="?"
fi

NPM_PUBLISHED=$(npm view karajan-code version 2>/dev/null || echo "unknown")

CHANGELOG_HEAD=$(head -20 CHANGELOG.md 2>/dev/null || echo "")
README_HEAD=$(head -5 README.md 2>/dev/null || echo "")

REMOTE_HEAD=$(git ls-remote origin HEAD 2>/dev/null | cut -f1 || echo "unknown")
LOCAL_HEAD=$(git rev-parse HEAD 2>/dev/null || echo "unknown")

# --- Evaluate each step ---

PENDING=0

# 1. Version bump: package.json and cli.js must match
if [ "$PKG_VERSION" = "$CLI_VERSION" ]; then
    S1="${CHECK} version match (package.json=$PKG_VERSION, cli.js=$CLI_VERSION)"
else
    S1="${CROSS} version MISMATCH: package.json=$PKG_VERSION, cli.js=$CLI_VERSION"
    PENDING=$((PENDING + 1))
fi

# 2. CHANGELOG updated for current version
if echo "$CHANGELOG_HEAD" | grep -q "\[$PKG_VERSION\]"; then
    S2="${CHECK} CHANGELOG.md contains [$PKG_VERSION]"
else
    S2="${CROSS} CHANGELOG.md missing entry for [$PKG_VERSION]"
    PENDING=$((PENDING + 1))
fi

# 3. README version (test count or feature mention — heuristic)
# Check that [Unreleased] is not the only section with content
if echo "$CHANGELOG_HEAD" | grep -q "^## \[Unreleased\]" && [ "$COMMITS_SINCE_TAG" != "0" ]; then
    S3="${YELLOW}?${NC} README/docs may need updating ($COMMITS_SINCE_TAG commits since $LATEST_TAG)"
    PENDING=$((PENDING + 1))
else
    S3="${CHECK} docs likely up to date (0 unreleased commits)"
fi

# 4. Git tag matches package.json version
if [ "$TAG_VERSION" = "$PKG_VERSION" ]; then
    S4="${CHECK} git tag v$PKG_VERSION exists"
else
    S4="${CROSS} git tag v$PKG_VERSION NOT found (latest: $LATEST_TAG)"
    PENDING=$((PENDING + 1))
fi

# 5. Push status: local HEAD matches remote HEAD
if [ "$LOCAL_HEAD" = "$REMOTE_HEAD" ]; then
    S5="${CHECK} pushed to origin (HEAD in sync)"
else
    S5="${CROSS} NOT pushed (local=$LOCAL_HEAD, remote=$REMOTE_HEAD)"
    PENDING=$((PENDING + 1))
fi

# 6. npm published version matches package.json
if [ "$NPM_PUBLISHED" = "$PKG_VERSION" ]; then
    S6="${CHECK} npm published v$NPM_PUBLISHED"
else
    S6="${CROSS} npm registry has v$NPM_PUBLISHED, package.json has v$PKG_VERSION"
    PENDING=$((PENDING + 1))
fi

# 7. Landing — cannot auto-check, always remind if there are pending items
if [ "$PENDING" -gt 0 ]; then
    S7="${YELLOW}?${NC} landing (karajancode.com) — verify manually"
else
    S7="${CHECK} landing — all other steps done, verify if landing needs update"
fi

# --- Output ---

echo ""
echo -e "${CYAN}┌──────────────────────────────────────────────────────────────────┐${NC}"
echo -e "${CYAN}│${NC}  ${BOLD}Release checklist${NC}  pkg:v${PKG_VERSION} tag:${LATEST_TAG} since:${COMMITS_SINCE_TAG}"
echo -e "${CYAN}├──────────────────────────────────────────────────────────────────┤${NC}"
echo -e "${CYAN}│${NC}  $S1"
echo -e "${CYAN}│${NC}  $S2"
echo -e "${CYAN}│${NC}  $S3"
echo -e "${CYAN}│${NC}  $S4"
echo -e "${CYAN}│${NC}  $S5"
echo -e "${CYAN}│${NC}  $S6"
echo -e "${CYAN}│${NC}  $S7"
echo -e "${CYAN}├──────────────────────────────────────────────────────────────────┤${NC}"
if [ "$PENDING" -eq 0 ]; then
    echo -e "${CYAN}│${NC}  ${GREEN}${BOLD}All release steps completed.${NC}"
else
    echo -e "${CYAN}│${NC}  ${RED}${BOLD}${PENDING} step(s) pending before release.${NC}"
fi
echo -e "${CYAN}└──────────────────────────────────────────────────────────────────┘${NC}"
echo ""

exit 0
