#!/usr/bin/env bash
# scripts/test-scripts - Validate all project scripts
set -euo pipefail

GREEN='\033[0;32m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FAILED=0

echo -e "${BLUE}Testing Project Scripts${NC}\n"

# Test script existence and executability
test_script() {
    local SCRIPT="$1"
    local DESCRIPTION="$2"
    
    if [ ! -f "$SCRIPT" ]; then
        echo -e "${RED}✗ MISSING: $SCRIPT${NC}"
        FAILED=1
        return 1
    fi
    
    if [ ! -x "$SCRIPT" ]; then
        echo -e "${RED}✗ NOT EXECUTABLE: $SCRIPT${NC}"
        FAILED=1
        return 1
    fi
    
    # Check shebang
    if ! head -1 "$SCRIPT" | grep -q "^#!/"; then
        echo -e "${RED}✗ NO SHEBANG: $SCRIPT${NC}"
        FAILED=1
        return 1
    fi
    
    # Check for set -euo pipefail
    if ! grep -q "set -euo pipefail" "$SCRIPT"; then
        echo -e "${RED}✗ MISSING 'set -euo pipefail': $SCRIPT${NC}"
        FAILED=1
        return 1
    fi
    
    # Check for description comment
    if ! head -3 "$SCRIPT" | grep -q "^# scripts/"; then
        echo -e "${RED}✗ MISSING DESCRIPTION: $SCRIPT${NC}"
        FAILED=1
        return 1
    fi
    
    echo -e "${GREEN}✓ $DESCRIPTION${NC}"
    return 0
}

# Test dev scripts
echo "Development Scripts:"
test_script "$SCRIPT_DIR/dev/shell" "scripts/dev/shell - Interactive shell"

# Test QA scripts
echo -e "\nQuality Assurance Scripts:"
test_script "$SCRIPT_DIR/qa/ecs-check" "scripts/qa/ecs-check - Code style check"
test_script "$SCRIPT_DIR/qa/ecs-fix" "scripts/qa/ecs-fix - Code style fix"
test_script "$SCRIPT_DIR/qa/phpstan" "scripts/qa/phpstan - Static analysis"
test_script "$SCRIPT_DIR/qa/phpunit" "scripts/qa/phpunit - Test runner"
test_script "$SCRIPT_DIR/qa/coverage-html" "scripts/qa/coverage-html - HTML coverage report"

# Test CI scripts
echo -e "\nCI/CD Scripts:"
test_script "$SCRIPT_DIR/ci/gitlab-ci-local" "scripts/ci/gitlab-ci-local - Local CI simulation"

# Syntax validation
echo -e "\nSyntax Validation:"
for script in "$SCRIPT_DIR"/{dev,qa,ci}/*; do
    if [ -f "$script" ] && [ -x "$script" ]; then
        if bash -n "$script" 2>/dev/null; then
            echo -e "${GREEN}✓ $(basename $script) - Valid bash syntax${NC}"
        else
            echo -e "${RED}✗ $(basename $script) - Syntax error${NC}"
            FAILED=1
        fi
    fi
done

# Test docker compose services exist
echo -e "\nDocker Compose Validation:"
if docker compose config --services 2>&1 | grep -q "app_server"; then
    echo -e "${GREEN}✓ app_server service exists${NC}"
else
    echo -e "${RED}✗ app_server service not found${NC}"
    FAILED=1
fi

# Test Help/Usage patterns
echo -e "\nUsage Documentation:"
SCRIPTS_WITH_USAGE=("ci/gitlab-ci-local")
for script_path in "${SCRIPTS_WITH_USAGE[@]}"; do
    if grep -q "# Usage:" "$SCRIPT_DIR/$script_path"; then
        echo -e "${GREEN}✓ $script_path has usage documentation${NC}"
    else
        echo -e "${RED}✗ $script_path missing usage documentation${NC}"
        FAILED=1
    fi
done

echo ""
if [ $FAILED -eq 0 ]; then
    echo -e "${GREEN}✓ All script tests passed${NC}"
    exit 0
else
    echo -e "${RED}✗ Some tests failed${NC}"
    exit 1
fi