#!/bin/bash

# Enhanced Story Validation Hook for Claude Code with Sub-Agent Support
# Implements R.O.C.K.E.T. framework validation for story files with sub-agent integration
# Usage: story-validation-hook-enhanced.sh <file_path> [agent_name]

set -euo pipefail

# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="$SCRIPT_DIR/../validation.log"
VALIDATION_ENGINE="$SCRIPT_DIR/story-validation-engine.js"
SUB_AGENT_VALIDATOR="$SCRIPT_DIR/sub-agent-validation-hook.js"
PERFORMANCE_MONITOR="$SCRIPT_DIR/performance-monitoring-hook.js"

# Input validation
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
    echo "Error: Usage: $0 <file_path> [agent_name]" >&2
    exit 1
fi

FILE_PATH="$1"
AGENT_NAME="${2:-unknown}"
START_TIME=$(date +%s%3N)  # Milliseconds

# Security: Validate file path to prevent injection attacks
if [[ "$FILE_PATH" =~ [^a-zA-Z0-9/_.-] ]]; then
    echo "Error: Invalid characters in file path" >&2
    exit 1
fi

# Security: Ensure file exists and is readable
if [ ! -f "$FILE_PATH" ]; then
    echo "Error: File does not exist: $FILE_PATH" >&2
    exit 1
fi

if [ ! -r "$FILE_PATH" ]; then
    echo "Error: File is not readable: $FILE_PATH" >&2
    exit 1
fi

TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# Logging function with agent context
log() {
    echo "[$TIMESTAMP] [$AGENT_NAME] $1" | tee -a "$LOG_FILE"
}

# Performance tracking function
track_performance() {
    local end_time=$(date +%s%3N)
    local duration=$((end_time - START_TIME))
    local error_flag=${1:-false}
    
    if [ -f "$PERFORMANCE_MONITOR" ]; then
        node "$PERFORMANCE_MONITOR" record "$AGENT_NAME" "$duration" "$error_flag" 2>/dev/null || true
    fi
}

# Check if file is a story file
if [[ ! "$FILE_PATH" =~ .*stories/.*\.md$ ]]; then
    log "INFO: File $FILE_PATH is not a story file, skipping validation"
    track_performance false
    exit 0
fi

log "Starting enhanced story validation for: $FILE_PATH"

# Detect if content was generated by a sub-agent
CONTENT=$(cat "$FILE_PATH")
SUB_AGENT_GENERATED=false

# Check for sub-agent signatures in content
if echo "$CONTENT" | grep -qE "(I'm [A-Z][a-z]+ [A-Z][A-Za-z']+|Irish [A-Za-z]+ Excellence|**Irish [A-Za-z]+ with)"; then
    SUB_AGENT_GENERATED=true
    log "INFO: Sub-agent generated content detected"
fi

# Run appropriate validation based on content type
if [ "$SUB_AGENT_GENERATED" = true ] && [ -f "$SUB_AGENT_VALIDATOR" ]; then
    log "Running sub-agent validation with R.O.C.K.E.T. framework..."
    
    # Run sub-agent specific validation
    if ! SUB_VALIDATION_RESULT=$(node "$SUB_AGENT_VALIDATOR" "$CONTENT" "$AGENT_NAME" 2>&1); then
        log "ERROR: Sub-agent validation failed: $SUB_VALIDATION_RESULT"
        track_performance true
        exit 2
    fi
    
    # Parse JSON result
    if ! PARSED_RESULT=$(echo "$SUB_VALIDATION_RESULT" | tail -n 1 | jq -r '.overallScore, .passed' 2>/dev/null); then
        log "ERROR: Failed to parse sub-agent validation result"
        track_performance true
        exit 1
    fi
    
    SCORE=$(echo "$PARSED_RESULT" | head -n 1)
    PASSED=$(echo "$PARSED_RESULT" | tail -n 1)
    
    if [ "$PASSED" = "true" ]; then
        STATUS="PASSED"
    else
        STATUS="FAILED"
    fi
    
    # Extract recommendations if available
    RECOMMENDATIONS=$(echo "$SUB_VALIDATION_RESULT" | tail -n 1 | jq -r '.recommendations[]?' 2>/dev/null | head -3 || echo "")
    
    log "Sub-agent validation completed - Score: $SCORE, Status: $STATUS"
    
else
    # Fall back to standard story validation
    log "Running standard R.O.C.K.E.T. validation engine..."
    
    # Check if validation engine exists
    if [ ! -f "$VALIDATION_ENGINE" ]; then
        log "ERROR: Validation engine not found at $VALIDATION_ENGINE"
        track_performance true
        exit 1
    fi
    
    # Run validation engine
    if ! VALIDATION_RESULT=$(node "$VALIDATION_ENGINE" "$FILE_PATH" 2>&1); then
        log "ERROR: Validation engine failed: $VALIDATION_RESULT"
        track_performance true
        exit 1
    fi
    
    # Parse validation result
    SCORE=$(echo "$VALIDATION_RESULT" | grep "SCORE:" | cut -d: -f2 | tr -d ' ')
    STATUS=$(echo "$VALIDATION_RESULT" | grep "STATUS:" | cut -d: -f2 | tr -d ' ')
    
    # Validate parsed values
    if [ -z "$SCORE" ] || [ -z "$STATUS" ]; then
        log "ERROR: Failed to parse validation result"
        log "Raw output: $VALIDATION_RESULT"
        track_performance true
        exit 1
    fi
    
    log "Standard validation completed - Score: $SCORE, Status: $STATUS"
fi

# Apply quality gate with agent-specific thresholds
declare -A AGENT_THRESHOLDS=(
    ["marketing-director"]=7.0
    ["engineering-director"]=8.0
    ["marketing-content-hooks"]=7.5
    ["marketing-viral-growth"]=7.5
    ["engineering-developer"]=8.0
    ["default"]=7.0
)

QUALITY_THRESHOLD=${AGENT_THRESHOLDS[$AGENT_NAME]:-${AGENT_THRESHOLDS[default]}}

# Convert score to integer for comparison (multiply by 10 to handle decimals)
if command -v bc >/dev/null 2>&1; then
    SCORE_INT=$(echo "$SCORE * 10" | bc -l | cut -d. -f1)
    THRESHOLD_INT=$(echo "$QUALITY_THRESHOLD * 10" | bc -l | cut -d. -f1)
else
    SCORE_INT=$(echo "$SCORE" | awk '{print int($1 * 10)}')
    THRESHOLD_INT=$(echo "$QUALITY_THRESHOLD" | awk '{print int($1 * 10)}')
fi

# Generate response based on validation result
if (( SCORE_INT >= THRESHOLD_INT )); then
    log "✅ PASS: Story validation successful (Score: $SCORE >= $QUALITY_THRESHOLD)"
    track_performance false
    
    # Generate success notification with agent context
    cat <<EOF
{
    "continue": true,
    "decision": "approve",
    "reason": "Story validation passed with score $SCORE/10 (Agent: $AGENT_NAME, Threshold: $QUALITY_THRESHOLD)",
    "agent": "$AGENT_NAME",
    "score": $SCORE,
    "threshold": $QUALITY_THRESHOLD,
    "validation_type": "$([ "$SUB_AGENT_GENERATED" = true ] && echo "sub-agent" || echo "standard")"
}
EOF
    exit 0
else
    log "❌ FAIL: Story validation failed (Score: $SCORE < $QUALITY_THRESHOLD)"
    track_performance true
    
    # Prepare recommendations for improvement
    IMPROVEMENT_SUGGESTIONS=""
    if [ -n "$RECOMMENDATIONS" ]; then
        IMPROVEMENT_SUGGESTIONS="Recommendations: $RECOMMENDATIONS"
    else
        IMPROVEMENT_SUGGESTIONS="Review R.O.C.K.E.T. framework compliance: Role clarity, Objective alignment, Context usage, Key instructions, Examples, and Tone"
    fi
    
    # Block execution and provide detailed feedback
    cat <<EOF
{
    "continue": false,
    "decision": "block", 
    "reason": "Story validation failed with score $SCORE/10. Minimum required: $QUALITY_THRESHOLD/10 for $AGENT_NAME. $IMPROVEMENT_SUGGESTIONS",
    "agent": "$AGENT_NAME",
    "score": $SCORE,
    "threshold": $QUALITY_THRESHOLD,
    "validation_type": "$([ "$SUB_AGENT_GENERATED" = true ] && echo "sub-agent" || echo "standard")",
    "improvements": "$IMPROVEMENT_SUGGESTIONS"
}
EOF
    exit 2
fi