#!/bin/bash
# Get agent hash following fallback hierarchy
# Usage: get-agent-hash <agent-name> [claude|opencode]
# Default target: claude

set -e

AGENT_NAME="$1"
TARGET="${2:-claude}"

if [[ -z "$AGENT_NAME" ]]; then
    echo "Usage: get-agent-hash <agent-name> [claude|opencode]" >&2
    echo "Returns hash for agent following fallback order:" >&2
    if [[ "$TARGET" == "opencode" ]]; then
        echo "1. .opencode/agent-hashes.json" >&2
        echo "2. .opencode/agent/<agent-name>.md git log" >&2
        echo "3. ~/.config/opencode/agent/<agent-name>.md git log" >&2
        echo "4. Special case: 'model' -> ~/.config/opencode/AGENTS.md git log" >&2
    else
        echo "1. .claude/agent-hashes.json" >&2
        echo "2. .claude/agents/<agent-name>.md git log" >&2
        echo "3. ~/.claude/agent-reserves/<agent-name>.md git log" >&2
        echo "4. Special case: 'model' -> ~/.claude/CLAUDE.md git log" >&2
    fi
    exit 1
fi

if [[ "$TARGET" != "claude" && "$TARGET" != "opencode" ]]; then
    echo "Error: Invalid target '$TARGET'. Use 'claude' or 'opencode'" >&2
    exit 1
fi

# Set up paths based on target
if [[ "$TARGET" == "opencode" ]]; then
    CONFIG_DIR=".opencode"
    AGENTS_DIR="agent"
    GLOBAL_AGENTS_DIR="$HOME/.config/opencode/agent"
    MODEL_FILE="$HOME/.config/opencode/AGENTS.md"
    MODEL_DIR="$HOME/.config/opencode"
else
    CONFIG_DIR=".claude"
    AGENTS_DIR="agents"
    GLOBAL_AGENTS_DIR="$HOME/.claude/agent-reserves"
    MODEL_FILE="$HOME/.claude/CLAUDE.md"
    MODEL_DIR="$HOME/.claude"
fi

# Special case for model
if [[ "$AGENT_NAME" == "model" ]]; then
    if [[ -f "$MODEL_FILE" ]]; then
        cd "$MODEL_DIR"
        git log --oneline -1 "$(basename "$MODEL_FILE")" | cut -d' ' -f1 2>/dev/null || echo "unknown"
    else
        echo "unknown"
    fi
    exit 0
fi

# 1. Check agent-hashes.json if it exists
if [[ -f "$CONFIG_DIR/agent-hashes.json" ]]; then
    HASH=$(jq -r ".agents[\"$AGENT_NAME\"].hash // empty" "$CONFIG_DIR/agent-hashes.json" 2>/dev/null || true)
    if [[ -n "$HASH" && "$HASH" != "null" ]]; then
        echo "$HASH"
        exit 0
    fi
fi

# 2. Check project agents/<agent-name>.md
if [[ -f "$CONFIG_DIR/$AGENTS_DIR/${AGENT_NAME}.md" ]]; then
    # Check if agents dir is a git repository
    if [[ -d "$CONFIG_DIR/$AGENTS_DIR/.git" ]]; then
        cd "$CONFIG_DIR/$AGENTS_DIR"
        HASH=$(git log --oneline -1 "${AGENT_NAME}.md" 2>/dev/null | cut -d' ' -f1 || echo "")
        if [[ -n "$HASH" ]]; then
            echo "$HASH"
            exit 0
        fi
    else
        # Not a separate git repo, check in main project repo
        HASH=$(git log --oneline -1 "$CONFIG_DIR/$AGENTS_DIR/${AGENT_NAME}.md" 2>/dev/null | cut -d' ' -f1 || echo "")
        if [[ -n "$HASH" ]]; then
            echo "$HASH"
            exit 0
        fi
    fi
fi

# 3. Check global agents/<agent-name>.md
if [[ -f "$GLOBAL_AGENTS_DIR/${AGENT_NAME}.md" ]]; then
    cd "$GLOBAL_AGENTS_DIR"
    HASH=$(git log --oneline -1 "${AGENT_NAME}.md" 2>/dev/null | cut -d' ' -f1 || echo "")
    if [[ -n "$HASH" ]]; then
        echo "$HASH"
        exit 0
    fi
fi

# No hash found
echo "unknown"