#!/bin/bash
# Grid Settings Integration
# Reads from Claude Code settings hierarchy with proper precedence
#
# Settings priority (highest to lowest):
#   1. Environment variables (GRID_*)
#   2. .claude/settings.local.json (local project overrides)
#   3. .claude/settings.json (project team settings)
#   4. ~/.claude/settings.json (user global settings)
#   5. .grid/config.json (legacy Grid config)
#   6. Built-in defaults
#
# Usage:
#   source ~/.claude/commands/grid/lib/settings.sh
#   tier=$(grid_read_setting "modelTier" "quality")
#   # or use convenience functions
#   tier=$(grid_model_tier)

# =============================================================================
# CORE SETTINGS READER
# =============================================================================

# Read a setting from the hierarchy with fallback to default
# Usage: grid_read_setting <key> [default]
# Example: grid_read_setting "modelTier" "quality"
grid_read_setting() {
    local key="$1"
    local default="${2:-}"
    local value=""

    # 1. Check environment variables first (GRID_* format)
    # Convert camelCase to UPPER_SNAKE_CASE for env var lookup
    local env_var="GRID_$(echo "$key" | sed 's/\([A-Z]\)/_\1/g' | tr '[:lower:]' '[:upper:]')"
    # Use eval for portable indirect variable expansion (works in bash and zsh)
    eval "value=\"\${$env_var:-}\""
    if [[ -n "$value" ]]; then
        echo "$value"
        return 0
    fi

    # 2. Check .claude/settings.local.json (local project overrides)
    if [[ -f ".claude/settings.local.json" ]]; then
        value=$(jq -r ".grid.$key // empty" ".claude/settings.local.json" 2>/dev/null)
        if [[ -n "$value" && "$value" != "null" ]]; then
            echo "$value"
            return 0
        fi
    fi

    # 3. Check .claude/settings.json (project team settings)
    if [[ -f ".claude/settings.json" ]]; then
        value=$(jq -r ".grid.$key // empty" ".claude/settings.json" 2>/dev/null)
        if [[ -n "$value" && "$value" != "null" ]]; then
            echo "$value"
            return 0
        fi
    fi

    # 4. Check ~/.claude/settings.json (user global settings)
    if [[ -f "$HOME/.claude/settings.json" ]]; then
        value=$(jq -r ".grid.$key // empty" "$HOME/.claude/settings.json" 2>/dev/null)
        if [[ -n "$value" && "$value" != "null" ]]; then
            echo "$value"
            return 0
        fi
    fi

    # 5. Check .grid/config.json (legacy Grid config - flat structure)
    if [[ -f ".grid/config.json" ]]; then
        value=$(jq -r ".$key // empty" ".grid/config.json" 2>/dev/null)
        if [[ -n "$value" && "$value" != "null" ]]; then
            echo "$value"
            return 0
        fi
    fi

    # 6. Return default
    echo "$default"
}

# Read a nested setting (e.g., notifications.system)
# Usage: grid_read_nested_setting <path> [default]
# Example: grid_read_nested_setting "notifications.system" "true"
grid_read_nested_setting() {
    local path="$1"
    local default="${2:-}"
    local value=""

    # Check each settings file in priority order
    for settings_file in ".claude/settings.local.json" ".claude/settings.json" "$HOME/.claude/settings.json"; do
        if [[ -f "$settings_file" ]]; then
            value=$(jq -r ".grid.$path // empty" "$settings_file" 2>/dev/null)
            if [[ -n "$value" && "$value" != "null" ]]; then
                echo "$value"
                return 0
            fi
        fi
    done

    # Legacy config doesn't support nested settings, return default
    echo "$default"
}

# =============================================================================
# CONVENIENCE FUNCTIONS
# =============================================================================

# Get model tier (quality, balanced, budget)
grid_model_tier() {
    grid_read_setting "modelTier" "quality"
}

# Get budget limit in dollars (0 = unlimited)
grid_budget_limit() {
    grid_read_setting "budgetLimit" "0"
}

# Get auto-verify setting (true/false)
grid_auto_verify() {
    grid_read_setting "autoVerify" "true"
}

# Get auto-refine setting (true/false)
grid_auto_refine() {
    grid_read_setting "autoRefine" "false"
}

# Get daemon mode setting (true/false)
grid_daemon_mode() {
    grid_read_setting "daemonMode" "false"
}

# Get quick mode threshold (max files for quick mode)
grid_quick_mode_threshold() {
    grid_read_setting "quickModeThreshold" "5"
}

# Get system notification preference
grid_notifications_system() {
    grid_read_nested_setting "notifications.system" "true"
}

# Get sound notification preference
grid_notifications_sound() {
    grid_read_nested_setting "notifications.sound" "true"
}

# =============================================================================
# BOOLEAN HELPERS
# =============================================================================

# Check if a boolean setting is enabled
# Usage: grid_is_enabled "autoVerify" && echo "enabled"
# Returns: 0 if true/enabled, 1 if false/disabled
grid_is_enabled() {
    local key="$1"
    local value
    value=$(grid_read_setting "$key" "false")

    case "$value" in
        true|True|TRUE|yes|Yes|YES|1|on|On|ON)
            return 0
            ;;
        *)
            return 1
            ;;
    esac
}

# =============================================================================
# MODEL SELECTION
# =============================================================================

# Get model for a specific agent, respecting tier and overrides
# Usage: grid_get_agent_model <agent_type>
# Example: grid_get_agent_model "planner"
grid_get_agent_model() {
    local agent_type="$1"
    local tier
    local custom_model=""

    # Check for Claude Code's native subagent model override first
    if [[ -n "${CLAUDE_CODE_SUBAGENT_MODEL:-}" ]]; then
        echo "$CLAUDE_CODE_SUBAGENT_MODEL"
        return 0
    fi

    # Check for per-agent model override in settings
    for settings_file in ".claude/settings.local.json" ".claude/settings.json" "$HOME/.claude/settings.json"; do
        if [[ -f "$settings_file" ]]; then
            custom_model=$(jq -r ".grid.models.$agent_type // empty" "$settings_file" 2>/dev/null)
            if [[ -n "$custom_model" && "$custom_model" != "null" ]]; then
                echo "$custom_model"
                return 0
            fi
        fi
    done

    # Check legacy config for custom model
    if [[ -f ".grid/config.json" ]]; then
        custom_model=$(jq -r ".models.$agent_type // empty" ".grid/config.json" 2>/dev/null)
        if [[ -n "$custom_model" && "$custom_model" != "null" ]]; then
            echo "$custom_model"
            return 0
        fi
    fi

    # Fall back to tier-based selection
    tier=$(grid_model_tier)

    case "$tier" in
        quality)
            echo "opus"
            ;;
        balanced)
            echo "sonnet"
            ;;
        budget)
            # Budget tier uses cheaper models for some agents
            case "$agent_type" in
                planner|executor|persona_simulator|refinement_synth|coordinator)
                    # These need reasoning capability
                    echo "sonnet"
                    ;;
                recognizer|visual_inspector|e2e_exerciser|scout|accountant|guard)
                    # These can use cheaper model
                    echo "haiku"
                    ;;
                *)
                    echo "sonnet"
                    ;;
            esac
            ;;
        *)
            # Default to quality tier
            echo "opus"
            ;;
    esac
}

# =============================================================================
# CONFIGURATION DISPLAY
# =============================================================================

# Display current effective configuration
# Usage: grid_show_config
grid_show_config() {
    echo "GRID SETTINGS CONFIGURATION"
    echo "==========================="
    echo ""
    echo "Settings Hierarchy (checked in order):"
    echo ""

    # Show environment variables
    echo "1. Environment Variables:"
    echo "   GRID_MODEL_TIER:           ${GRID_MODEL_TIER:-<not set>}"
    echo "   GRID_BUDGET_LIMIT:         ${GRID_BUDGET_LIMIT:-<not set>}"
    echo "   GRID_AUTO_VERIFY:          ${GRID_AUTO_VERIFY:-<not set>}"
    echo "   GRID_AUTO_REFINE:          ${GRID_AUTO_REFINE:-<not set>}"
    echo "   GRID_DAEMON_MODE:          ${GRID_DAEMON_MODE:-<not set>}"
    echo "   GRID_QUICK_MODE_THRESHOLD: ${GRID_QUICK_MODE_THRESHOLD:-<not set>}"
    echo "   CLAUDE_CODE_SUBAGENT_MODEL: ${CLAUDE_CODE_SUBAGENT_MODEL:-<not set>}"
    echo ""

    # Show file sources
    echo "2. Local Settings:   $([ -f '.claude/settings.local.json' ] && echo '.claude/settings.local.json' || echo '<not present>')"
    echo "3. Project Settings: $([ -f '.claude/settings.json' ] && echo '.claude/settings.json' || echo '<not present>')"
    echo "4. User Settings:    $([ -f "$HOME/.claude/settings.json" ] && echo '~/.claude/settings.json' || echo '<not present>')"
    echo "5. Legacy Config:    $([ -f '.grid/config.json' ] && echo '.grid/config.json' || echo '<not present>')"
    echo ""

    # Show effective values
    echo "Effective Configuration:"
    echo "------------------------"
    echo "  Model Tier:           $(grid_model_tier)"
    echo "  Budget Limit:         \$$(grid_budget_limit)"
    echo "  Auto-Verify:          $(grid_auto_verify)"
    echo "  Auto-Refine:          $(grid_auto_refine)"
    echo "  Daemon Mode:          $(grid_daemon_mode)"
    echo "  Quick Mode Threshold: $(grid_quick_mode_threshold) files"
    echo "  Notifications System: $(grid_notifications_system)"
    echo "  Notifications Sound:  $(grid_notifications_sound)"
    echo ""
}

# Show which file provides each setting (for debugging)
# Usage: grid_debug_settings
grid_debug_settings() {
    echo "GRID SETTINGS DEBUG"
    echo "==================="
    echo ""

    local keys=("modelTier" "budgetLimit" "autoVerify" "autoRefine" "daemonMode" "quickModeThreshold")

    for key in "${keys[@]}"; do
        local source="default"
        local value=""

        # Check env var (use eval for portable indirect variable expansion)
        local env_var="GRID_$(echo "$key" | sed 's/\([A-Z]\)/_\1/g' | tr '[:lower:]' '[:upper:]')"
        local env_value=""
        eval "env_value=\"\${$env_var:-}\""
        if [[ -n "$env_value" ]]; then
            source="ENV:$env_var"
            value="$env_value"
        elif [[ -f ".claude/settings.local.json" ]] && jq -e ".grid.$key" ".claude/settings.local.json" >/dev/null 2>&1; then
            source=".claude/settings.local.json"
            value=$(jq -r ".grid.$key" ".claude/settings.local.json")
        elif [[ -f ".claude/settings.json" ]] && jq -e ".grid.$key" ".claude/settings.json" >/dev/null 2>&1; then
            source=".claude/settings.json"
            value=$(jq -r ".grid.$key" ".claude/settings.json")
        elif [[ -f "$HOME/.claude/settings.json" ]] && jq -e ".grid.$key" "$HOME/.claude/settings.json" >/dev/null 2>&1; then
            source="~/.claude/settings.json"
            value=$(jq -r ".grid.$key" "$HOME/.claude/settings.json")
        elif [[ -f ".grid/config.json" ]] && jq -e ".$key" ".grid/config.json" >/dev/null 2>&1; then
            source=".grid/config.json (legacy)"
            value=$(jq -r ".$key" ".grid/config.json")
        else
            value=$(grid_read_setting "$key" "<default>")
        fi

        printf "  %-20s = %-15s  [from: %s]\n" "$key" "$value" "$source"
    done
    echo ""
}

# =============================================================================
# EXPORT FUNCTIONS
# =============================================================================

export -f grid_read_setting
export -f grid_read_nested_setting
export -f grid_model_tier
export -f grid_budget_limit
export -f grid_auto_verify
export -f grid_auto_refine
export -f grid_daemon_mode
export -f grid_quick_mode_threshold
export -f grid_notifications_system
export -f grid_notifications_sound
export -f grid_is_enabled
export -f grid_get_agent_model
export -f grid_show_config
export -f grid_debug_settings
