#!/bin/sh
#
# Pre-commit hook for Manifold
# Runs code quality checks on staged Go files
#

set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo "${YELLOW}Running pre-commit checks...${NC}"

# Get list of staged Go files
STAGED_GO_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.go$' || true)

if [ -z "$STAGED_GO_FILES" ]; then
    echo "${GREEN}✓ No Go files staged, skipping checks${NC}"
    exit 0
fi

echo "${YELLOW}Checking staged Go files:${NC}"
echo "$STAGED_GO_FILES" | sed 's/^/  - /'
echo ""

# 1. Run gofmt check
echo "${YELLOW}[1/4] Running gofmt...${NC}"
UNFORMATTED=$(echo "$STAGED_GO_FILES" | xargs gofmt -l)
if [ -n "$UNFORMATTED" ]; then
    echo "${RED}✗ The following files are not formatted with gofmt:${NC}"
    echo "$UNFORMATTED" | sed 's/^/    /'
    echo "${YELLOW}Run: gofmt -w <file> or make fmt${NC}"
    exit 1
fi
echo "${GREEN}✓ gofmt passed${NC}"

# 2. Run go vet
echo "${YELLOW}[2/4] Running go vet...${NC}"
VET_OUTPUT=$(go vet $(go list ./... | grep -v '/tmp/') 2>&1 | grep -v "error generated" | grep -v "^$" | grep -v "^\s*|" || true)
if [ -n "$VET_OUTPUT" ]; then
    echo "${RED}✗ go vet found issues:${NC}"
    echo "$VET_OUTPUT"
    exit 1
fi
echo "${GREEN}✓ go vet passed${NC}"

# 3. Run staticcheck for unused code (if available)
echo "${YELLOW}[3/4] Running staticcheck for unused code...${NC}"
if command -v staticcheck >/dev/null 2>&1; then
    # Run staticcheck with unused code checks only, excluding tmp/
    STATICCHECK_OUTPUT=$(staticcheck -checks="U*" $(go list ./... | grep -v '/tmp/') 2>&1 | grep -v "error generated" | grep -v "^$" | grep -v "^\s*|" || true)
    if [ -n "$STATICCHECK_OUTPUT" ]; then
        echo "${RED}✗ staticcheck found unused code:${NC}"
        echo "$STATICCHECK_OUTPUT"
        echo "${YELLOW}Tip: Run 'staticcheck -checks=\"U*\" ./...' to see details${NC}"
        exit 1
    fi
    echo "${GREEN}✓ staticcheck passed${NC}"
else
    echo "${YELLOW}⚠ staticcheck not installed, skipping unused code detection${NC}"
    echo "${YELLOW}  Install: go install honnef.co/go/tools/cmd/staticcheck@latest${NC}"
fi

# 4. Run go build check on changed packages
echo "${YELLOW}[4/4] Running build check...${NC}"
CHANGED_PKGS=$(echo "$STAGED_GO_FILES" | xargs -n1 dirname | sort -u | sed 's|^|./|' | tr '\n' ' ')
if [ -n "$CHANGED_PKGS" ]; then
    BUILD_OUTPUT=$(go build $CHANGED_PKGS 2>&1 | grep -v "error generated" | grep -v "^$" | grep -v "^\s*|" || true)
    if [ -n "$BUILD_OUTPUT" ]; then
        echo "${RED}✗ Build failed:${NC}"
        echo "$BUILD_OUTPUT"
        exit 1
    fi
    echo "${GREEN}✓ Build check passed${NC}"
fi

echo ""
echo "${GREEN}✓ All pre-commit checks passed!${NC}"
exit 0
