#!/bin/bash

# --- CONFIGURATION ---
# It is highly recommended to set this in your .bashrc or .env file instead of hardcoding
export GOOGLE_API_KEY="AIzaSyDTwKBQsn3q2dtR_tKRVl7Anc87Ru1ek_s" 
CODE_DIR=$(pwd)
PLAN_DIR="/mnt/ext_ssd/agent_data" 
TASK_FILE="$CODE_DIR/current_task.txt"

mkdir -p "$PLAN_DIR" || { echo "FATAL ERROR: Could not create directory $PLAN_DIR." >&2; exit 1; }
LOG_FILE="$PLAN_DIR/agent_run_$(date +%Y%m%d_%H%M%S).log"

# --- CHECK FOR TASK ARGUMENT ---
if [ -z "$1" ]; then
    echo "Usage: $0 \"<Your development task description>\""
    exit 1
fi

TASK="$1"
CONTEXT_FILES="$CODE_DIR/bugs.md @$CODE_DIR/ChangeLog.md @$CODE_DIR/roadmap.md @$CODE_DIR/gemini.md"

# --- CORE AGENT WORKFLOW FUNCTION ---
run_agent_workflow() {
    local TASK_PROMPT="$1"
    
    echo "--- 🤖 Starting New Agent Attempt ---" | tee -a "$LOG_FILE"
    echo "Task: $TASK_PROMPT" | tee -a "$LOG_FILE"
    
    echo -e "\n--- 💾 ACTION REQUIRED: SAVE PROJECT STATE ---" | tee -a "$LOG_FILE"
    echo "Backup confirmed. Proceeding..." | tee -a "$LOG_FILE"

    PLAN_FILE="$PLAN_DIR/plan_$(date +%Y%m%d_%H%M%S).md"
    touch "$PLAN_FILE"

    # --- AGENT 1: PLANNER ---
    echo -e "\n--- 🧠 AGENT 1: PLANNER ---" | tee -a "$LOG_FILE"
    
    PLANNER_QUERY=$(cat <<END_OF_PLANNER_PROMPT
Your role is the Lead Architect. Based on the task: '$TASK_PROMPT', create a strictly numbered development plan. 
For each step, specify the EXACT file path to be modified.
Save ONLY the numbered list. No conversational filler.
END_OF_PLANNER_PROMPT
    )

    PLANNER_OUTPUT=$(echo "$PLANNER_QUERY" | gemini $(echo $CONTEXT_FILES) 2>&1)
    echo "$PLANNER_OUTPUT" > "$PLAN_FILE"
    echo "$PLANNER_OUTPUT" >> "$LOG_FILE"
    
    if [ ! -s "$PLAN_FILE" ]; then
        echo "ERROR: Planner failed. Aborting." | tee -a "$LOG_FILE"
        return 2
    fi

    # --- AGENT 2: EXECUTER ---
    echo -e "\n--- 💻 AGENT 2: EXECUTER (Applying Changes) ---" | tee -a "$LOG_FILE"
    
    mapfile -t PLAN_STEPS < <(grep -E '^[0-9]+\.' "$PLAN_FILE" | sed 's/^[[:space:]]*//')
    STEP_COUNT=${#PLAN_STEPS[@]}
    
    for i in "${!PLAN_STEPS[@]}"; do
        STEP_NUM=$((i + 1))
        STEP_CONTENT="${PLAN_STEPS[$i]}"
        echo "Executing Step $STEP_NUM/$STEP_COUNT: $STEP_CONTENT" | tee -a "$LOG_FILE"
        
        EXECUTER_QUERY=$(cat <<END_OF_EXECUTER_PROMPT
Your role is the Systems Engineer. 
OVERALL GOAL: '$TASK_PROMPT'
CURRENT STEP: '$STEP_CONTENT'

CRITICAL INSTRUCTION: Do not just explain code. You MUST use your tools to READ and EDIT the files in $CODE_DIR. 
1. Read the file mentioned in the step.
2. Apply the necessary changes using your write or edit tools.
3. Verify the change was successful.
4. Append a brief 'EXECUTER NOTE:' to the end of $PLAN_FILE describing the physical change made.

Talk is cheap. Modify the code now.
END_OF_EXECUTER_PROMPT
        )
        
        # We pass @$PLAN_FILE so the agent sees notes from previous steps
        EXECUTER_OUTPUT=$(echo "$EXECUTER_QUERY" | gemini -y $CONTEXT_FILES @$PLAN_FILE 2>&1)
        echo "$EXECUTER_OUTPUT" >> "$LOG_FILE"
    done

    # --- AGENT 3: REVIEWER ---
    echo -e "\n--- ✨ AGENT 3: REVIEWER & DOCUMENTER ---" | tee -a "$LOG_FILE"

    REVIEWER_QUERY=$(cat <<END_OF_REVIEWER_PROMPT
Your role is the QA Inspector. The task was '$TASK_PROMPT'. 
1. Score the result: 'SCORE: [number]/10'.
2. Verify if files in $CODE_DIR actually changed.
3. Update bugs.md, ChangeLog.md, and roadmap.md.
4. If failed (Score < 7.5), provide 'NEW_PROMPT: [refined prompt]'.
END_OF_REVIEWER_PROMPT
    )

    REVIEW_OUTPUT=$(echo "$REVIEWER_QUERY" | gemini -y $CONTEXT_FILES @$PLAN_FILE 2>&1)
    echo "$REVIEW_OUTPUT" >> "$LOG_FILE"

    SCORE_LINE=$(echo "$REVIEW_OUTPUT" | grep -E 'SCORE: [0-9]+\.?[0-9]*\/10')
    SCORE=$(echo "$SCORE_LINE" | sed -n 's/.*SCORE: \([0-9]*\.[0-9]\|[0-9]\)\/10.*/\1/p')
    
    [ -z "$SCORE" ] && SCORE=0.0
    FLOAT_SCORE=$(echo "$SCORE * 10" | bc)
    
    if (( $(echo "$FLOAT_SCORE >= 75" | bc -l) )); then
        echo "✅ SUCCESS! Score: $SCORE/10" | tee -a "$LOG_FILE"
        return 0
    else
        echo "❌ FAILURE! Score: $SCORE/10" | tee -a "$LOG_FILE"
        
        NEW_PROMPT=$(echo "$REVIEW_OUTPUT" | grep -m 1 "NEW_PROMPT:" | sed 's/.*NEW_PROMPT:[[:space:]]*//')
        TASK_TO_RETRY="${NEW_PROMPT:-$TASK}"
        return 1
    fi
}

# --- MAIN RETRY LOOP ---
while true; do
    run_agent_workflow "$TASK"
    EXIT_CODE=$?
    
    if [ "$EXIT_CODE" -eq 0 ]; then break; fi
    if [ "$EXIT_CODE" -ne 1 ]; then exit $EXIT_CODE; fi
    TASK="$TASK_TO_RETRY"
    sleep 2
done