#!/bin/bash
#
# Pre-push hook: Runs full CI validation before pushing to remote
# - Format check (cargo fmt)
# - Clippy lint check
# - Cargo deny (licenses/advisories)
# - Unit tests
#
# Output is structured for LLM consumption with clear issue identification

set -e

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

# Track failures
FAILED=0
ISSUES=""
FAILED_CHECKS=""

echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE}                    PRE-PUSH CI VALIDATION${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN}Running full CI suite to prevent push failures...${NC}"
echo ""

# ============================================================================
# Format Check
# ============================================================================
echo -e "${YELLOW}[1/4] Checking code formatting...${NC}"

FMT_OUTPUT=$(cargo fmt -- --check 2>&1) || FMT_EXIT=$?
FMT_EXIT=${FMT_EXIT:-0}

if [ $FMT_EXIT -ne 0 ]; then
    FAILED=1
    FAILED_CHECKS="${FAILED_CHECKS} format"
    echo -e "${RED}✗ Format check failed${NC}"
    echo ""
    echo -e "${RED}--- FORMAT ISSUES (LLM-ACTIONABLE) ---${NC}"
    echo "ISSUE_TYPE: formatting"
    echo "CI_JOB: lint"
    echo "FIX_COMMAND: cargo fmt"
    echo "DESCRIPTION: The following files have formatting issues:"
    echo ""
    echo "$FMT_OUTPUT" | grep -E "^Diff in" | while read -r line; do
        FILE=$(echo "$line" | sed 's/Diff in //' | sed 's/ at.*//')
        echo "  FILE: $FILE"
    done
    echo ""
    echo "AUTO_FIX_AVAILABLE: yes"
    echo "AUTO_FIX: Run 'cargo fmt' to automatically fix all formatting issues"
    echo -e "${RED}--- END FORMAT ISSUES ---${NC}"
    echo ""

    ISSUES="${ISSUES}\n- FORMAT: Run 'cargo fmt'"
else
    echo -e "${GREEN}✓ Format check passed${NC}"
fi
echo ""

# ============================================================================
# Clippy Lint Check
# ============================================================================
echo -e "${YELLOW}[2/4] Running clippy lints...${NC}"

CLIPPY_OUTPUT=$(cargo clippy --all-targets --all-features -- -D warnings 2>&1) || CLIPPY_EXIT=$?
CLIPPY_EXIT=${CLIPPY_EXIT:-0}

if [ $CLIPPY_EXIT -ne 0 ]; then
    FAILED=1
    FAILED_CHECKS="${FAILED_CHECKS} clippy"
    echo -e "${RED}✗ Clippy check failed${NC}"
    echo ""
    echo -e "${RED}--- CLIPPY ISSUES (LLM-ACTIONABLE) ---${NC}"
    echo "ISSUE_TYPE: clippy_lint"
    echo "CI_JOB: lint"
    echo "DESCRIPTION: Clippy found issues that would fail CI:"
    echo ""

    # Parse and display clippy errors/warnings with file locations
    echo "LINT_DETAILS:"
    echo "$CLIPPY_OUTPUT" | grep -E "^(warning|error)\[" | head -20 | while read -r line; do
        echo "  $line"
    done
    echo ""

    echo "AFFECTED_LOCATIONS:"
    echo "$CLIPPY_OUTPUT" | grep -E "^\s*-->" | sed 's/.*--> /  /' | sort -u | head -20
    echo ""

    echo "AUTO_FIX_AVAILABLE: partial"
    echo "AUTO_FIX: Run 'cargo clippy --fix --allow-dirty' for auto-fixable issues"
    echo "MANUAL_FIX: Review warnings above and fix manually"
    echo -e "${RED}--- END CLIPPY ISSUES ---${NC}"
    echo ""

    ISSUES="${ISSUES}\n- CLIPPY: Fix lint warnings"
else
    echo -e "${GREEN}✓ Clippy check passed${NC}"
fi
echo ""

# ============================================================================
# Cargo Deny Check
# ============================================================================
echo -e "${YELLOW}[3/4] Checking licenses and security advisories...${NC}"

# Check if cargo-deny is installed
if command -v cargo-deny &> /dev/null; then
    DENY_OUTPUT=$(cargo deny check 2>&1) || DENY_EXIT=$?
    DENY_EXIT=${DENY_EXIT:-0}

    if [ $DENY_EXIT -ne 0 ]; then
        FAILED=1
        FAILED_CHECKS="${FAILED_CHECKS} deny"
        echo -e "${RED}✗ Cargo deny check failed${NC}"
        echo ""
        echo -e "${RED}--- CARGO DENY ISSUES (LLM-ACTIONABLE) ---${NC}"
        echo "ISSUE_TYPE: dependency_check"
        echo "CI_JOB: deny"
        echo "DESCRIPTION: License or security issues found in dependencies:"
        echo ""

        # Show advisories
        if echo "$DENY_OUTPUT" | grep -q "advisories"; then
            echo "SECURITY_ADVISORIES:"
            echo "$DENY_OUTPUT" | grep -A5 "security vulnerability" | head -20
            echo ""
        fi

        # Show license issues
        if echo "$DENY_OUTPUT" | grep -q "license"; then
            echo "LICENSE_ISSUES:"
            echo "$DENY_OUTPUT" | grep -E "(denied|not explicitly allowed)" | head -10
            echo ""
        fi

        # Show banned crates
        if echo "$DENY_OUTPUT" | grep -q "banned"; then
            echo "BANNED_CRATES:"
            echo "$DENY_OUTPUT" | grep -E "banned" | head -10
            echo ""
        fi

        echo "FULL_OUTPUT:"
        echo "$DENY_OUTPUT" | tail -30
        echo ""
        echo "FIX: Update dependencies or modify deny.toml configuration"
        echo -e "${RED}--- END CARGO DENY ISSUES ---${NC}"
        echo ""

        ISSUES="${ISSUES}\n- DENY: Fix dependency license/security issues"
    else
        echo -e "${GREEN}✓ Cargo deny check passed${NC}"
    fi
else
    echo -e "${YELLOW}⚠ cargo-deny not installed, skipping (CI will still check)${NC}"
    echo "  Install with: cargo install cargo-deny"
fi
echo ""

# ============================================================================
# Test Suite
# ============================================================================
echo -e "${YELLOW}[4/4] Running test suite...${NC}"

TEST_OUTPUT=$(cargo test --no-fail-fast 2>&1) || TEST_EXIT=$?
TEST_EXIT=${TEST_EXIT:-0}

if [ $TEST_EXIT -ne 0 ]; then
    FAILED=1
    FAILED_CHECKS="${FAILED_CHECKS} tests"
    echo -e "${RED}✗ Tests failed${NC}"
    echo ""
    echo -e "${RED}--- TEST FAILURES (LLM-ACTIONABLE) ---${NC}"
    echo "ISSUE_TYPE: test_failure"
    echo "CI_JOB: test"
    echo "DESCRIPTION: The following tests failed:"
    echo ""

    # Extract failed test names
    echo "FAILED_TESTS:"
    echo "$TEST_OUTPUT" | grep -E "^test .+ FAILED" | while read -r line; do
        TEST_NAME=$(echo "$line" | sed 's/test //' | sed 's/ \.\.\. FAILED//')
        echo "  - $TEST_NAME"
    done
    echo ""

    # Extract assertion failures and panics
    echo "FAILURE_DETAILS:"
    echo "$TEST_OUTPUT" | grep -A10 "^---- .* ----" | head -50
    echo ""

    # Show test summary
    echo "TEST_SUMMARY:"
    echo "$TEST_OUTPUT" | grep -E "^test result:" | tail -1
    echo ""

    echo "DEBUG_COMMAND: cargo test --no-fail-fast -- --nocapture"
    echo "SINGLE_TEST: cargo test <test_name> -- --nocapture"
    echo -e "${RED}--- END TEST FAILURES ---${NC}"
    echo ""

    ISSUES="${ISSUES}\n- TESTS: Fix failing tests (see above)"
else
    echo -e "${GREEN}✓ All tests passed${NC}"
    echo "$TEST_OUTPUT" | grep -E "^test result:" | tail -1
fi
echo ""

# ============================================================================
# Summary
# ============================================================================
echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
if [ $FAILED -ne 0 ]; then
    echo -e "${RED}PRE-PUSH VALIDATION FAILED${NC}"
    echo ""
    echo -e "${RED}--- CI FAILURE SUMMARY (LLM-ACTIONABLE) ---${NC}"
    echo "STATUS: FAILED"
    echo "BLOCKING: push"
    echo "FAILED_CI_JOBS:${FAILED_CHECKS}"
    echo -e "REQUIRED_FIXES:${ISSUES}"
    echo ""
    echo "QUICK_FIX_COMMANDS:"
    if [[ "$FAILED_CHECKS" == *"format"* ]]; then
        echo "  cargo fmt                              # Fix formatting"
    fi
    if [[ "$FAILED_CHECKS" == *"clippy"* ]]; then
        echo "  cargo clippy --fix --allow-dirty       # Auto-fix clippy issues"
    fi
    if [[ "$FAILED_CHECKS" == *"tests"* ]]; then
        echo "  cargo test                             # Re-run tests after fixes"
    fi
    echo ""
    echo "FULL_CI_CHECK: task ci"
    echo ""
    echo "SUGGESTED_WORKFLOW:"
    echo "  1. Fix issues listed above"
    echo "  2. Run 'task ci' to verify all checks pass"
    echo "  3. Commit fixes: git commit -am 'fix: resolve CI issues'"
    echo "  4. Retry push"
    echo -e "${RED}--- END SUMMARY ---${NC}"
    echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
    exit 1
else
    echo -e "${GREEN}ALL CI CHECKS PASSED ✓${NC}"
    echo -e "${CYAN}Safe to push to remote${NC}"
    echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
    exit 0
fi
