#!/bin/bash

# switch-provider - Switch OpenClaw AI provider (Bedrock / MiniMax)

set -e

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Help
show_help() {
    echo -e "${BLUE}switch-provider - OpenClaw AI Provider Switch Tool${NC}"
    echo ""
    echo "Usage:"
    echo "  switch-provider <member-name|me> <provider>"
    echo ""
    echo "Arguments:"
    echo "  member-name  - Team member name (e.g., member1, code-expert, qiangwu)"
    echo "                 or 'me' / 'current' for current agent"
    echo "  provider     - AI provider: bedrock | minimax"
    echo ""
    echo "Examples:"
    echo "  switch-provider me minimax          # Switch current agent to MiniMax"
    echo "  switch-provider me bedrock          # Switch current agent to Bedrock"
    echo "  switch-provider member1 bedrock     # Switch team member to Bedrock"
    echo "  switch-provider code-expert minimax # Switch code expert to MiniMax"
    echo ""
    echo "Show help:"
    echo "  switch-provider help"
}

# Check arguments
if [ "$1" == "help" ] || [ -z "$1" ]; then
    show_help
    exit 0
fi

if [ -z "$2" ]; then
    echo -e "${RED}Error: Missing argument${NC}"
    show_help
    exit 1
fi

NAME="$1"
PROVIDER="$2"

# Validate provider
VALID_PROVIDERS=("bedrock" "minimax")
if [[ ! " ${VALID_PROVIDERS[@]} " =~ " ${PROVIDER} " ]]; then
    echo -e "${RED}Error: Unsupported provider: ${PROVIDER}${NC}"
    echo "Supported providers: ${VALID_PROVIDERS[*]}"
    exit 1
fi

# Check if switching current agent
if [ "$NAME" == "me" ] || [ "$NAME" == "current" ] || [ "$NAME" == "self" ]; then
    SWITCH_CURRENT=true
    CONFIG_FILE="$HOME/.openclaw/openclaw.json"
    CONTAINER_NAME=""
else
    SWITCH_CURRENT=false
    CONFIG_DIR="$HOME/openclaw-config/openclaw-${NAME}"
    CONFIG_FILE="${CONFIG_DIR}/openclaw.json"
    CONTAINER_NAME="openclaw-${NAME}"

    # Validate member
    VALID_MEMBERS=("member1" "member2" "member3" "code-expert" "qiangwu")
    if [[ ! " ${VALID_MEMBERS[@]} " =~ " ${NAME} " ]]; then
        echo -e "${RED}Error: Unsupported member: ${NAME}${NC}"
        echo "Supported members: ${VALID_MEMBERS[*]} (or 'me' for current agent)"
        exit 1
    fi
fi

echo -e "${GREEN}Switching ${NAME} to ${PROVIDER}${NC}"
echo "=========================================="

# Check config file
if [ ! -f "$CONFIG_FILE" ]; then
    echo -e "${RED}Error: Config file not found: ${CONFIG_FILE}${NC}"
    exit 1
fi

echo "Reading current config..."

# Get credentials based on provider
if [ "$PROVIDER" == "bedrock" ]; then
    AWS_BEARER_TOKEN="${AWS_BEARER_TOKEN_BEDROCK:-}"
    AWS_REGION="${AWS_REGION:-us-east-1}"
    ANTHROPIC_PROVIDER="${ANTHROPIC_PROVIDER:-}"

    if [ -z "$AWS_BEARER_TOKEN" ]; then
        echo -e "${YELLOW}Warning: AWS_BEARER_TOKEN_BEDROCK not set${NC}"
        read -p "Enter AWS Bedrock Bearer Token: " AWS_BEARER_TOKEN
    fi

    if [ -z "$ANTHROPIC_PROVIDER" ]; then
        echo -e "${YELLOW}Warning: ANTHROPIC_PROVIDER not set${NC}"
        read -p "Enter Anthropic Model ARN: " ANTHROPIC_PROVIDER
    fi

elif [ "$PROVIDER" == "minimax" ]; then
    MINIMAX_API_KEY="${MINIMAX_API_KEY:-}"

    if [ -z "$MINIMAX_API_KEY" ]; then
        # Try to extract from existing config
        MINIMAX_API_KEY=$(node -e "
try {
    const fs = require('fs');
    const config = JSON.parse(fs.readFileSync('$CONFIG_FILE', 'utf8'));
    const apiKey = config?.auth?.profiles?.['minimax:default']?.['api-key'] || '';
    console.log(apiKey);
} catch (e) {
    console.log('');
}
" 2>/dev/null || echo "")
    fi

    if [ -z "$MINIMAX_API_KEY" ]; then
        echo -e "${YELLOW}Warning: MINIMAX_API_KEY not set${NC}"
        read -p "Enter MiniMax API Key: " MINIMAX_API_KEY
    fi
fi

echo "Configuring ${PROVIDER} provider..."

# Update config file
if [ "$PROVIDER" == "bedrock" ]; then
    node -e "
const fs = require('fs');
let config = {};
try {
    config = JSON.parse(fs.readFileSync('$CONFIG_FILE', 'utf8'));
} catch (e) {
    config = {};
}

// Configure Bedrock provider
if (!config.providers) config.providers = {};
if (!config.providers.providers) config.providers.providers = {};

config.providers.providers['amazon-bedrock'] = {
    'baseUrl': 'https://bedrock-runtime.${AWS_REGION}.amazonaws.com',
    'api': 'bedrock-converse-stream',
    'auth': 'aws-sdk',
    'providers': [
        {
            'id': '${ANTHROPIC_PROVIDER}',
            'name': 'Claude Opus 4.6 (Bedrock)',
            'reasoning': true,
            'contextWindow': 200000,
            'maxTokens': 8192
        }
    ]
};

// Enable Bedrock discovery
if (!config.providers.bedrockDiscovery) config.providers.bedrockDiscovery = {};
config.providers.bedrockDiscovery.enabled = true;
config.providers.bedrockDiscovery.region = '${AWS_REGION}';

// Set default agent provider
if (!config.agents) config.agents = {};
if (!config.agents.defaults) config.agents.defaults = {};
if (!config.agents.defaults.provider) config.agents.defaults.provider = {};
config.agents.defaults.provider.primary = 'amazon-bedrock/${ANTHROPIC_PROVIDER}';

// Add environment variables for AWS authentication
if (!config.env) config.env = {};
config.env.AWS_BEARER_TOKEN_BEDROCK = '${AWS_BEARER_TOKEN}';
config.env.AWS_REGION = '${AWS_REGION}';
config.env.CLAUDE_CODE_USE_BEDROCK = '1';

fs.writeFileSync('$CONFIG_FILE', JSON.stringify(config, null, 2));
console.log('Config updated to use Bedrock');
"

elif [ "$PROVIDER" == "minimax" ]; then
    node -e "
const fs = require('fs');
let config = {};
try {
    config = JSON.parse(fs.readFileSync('$CONFIG_FILE', 'utf8'));
} catch (e) {
    config = {};
}

// Configure MiniMax provider
if (!config.providers) config.providers = {};
if (!config.providers.providers) config.providers.providers = {};

config.providers.providers.minimax = {
    'baseUrl': 'https://api.minimax.io/anthropic',
    'api': 'anthropic-messages',
    'providers': [
        {
            'id': 'MiniMax-M2.5',
            'name': 'MiniMax M2.5',
            'reasoning': true
        }
    ]
};

// Set default agent provider
if (!config.agents) config.agents = {};
if (!config.agents.defaults) config.agents.defaults = {};
if (!config.agents.defaults.provider) config.agents.defaults.provider = {};
config.agents.defaults.provider.primary = 'minimax/MiniMax-M2.5';

// Configure authentication
if (!config.auth) config.auth = {};
if (!config.auth.profiles) config.auth.profiles = {};
config.auth.profiles['minimax:default'] = {
    provider: 'minimax',
    mode: 'api_key',
    'api-key': '${MINIMAX_API_KEY}'
};

// Remove Bedrock env vars if switching from Bedrock
if (config.env) {
    delete config.env.AWS_BEARER_TOKEN_BEDROCK;
    delete config.env.CLAUDE_CODE_USE_BEDROCK;
}

fs.writeFileSync('$CONFIG_FILE', JSON.stringify(config, null, 2));
console.log('Config updated to use MiniMax');
"
fi

echo "Config updated"

# Restart container (if team member)
if [ "$SWITCH_CURRENT" == "false" ]; then
    set +e

    command -v docker &> /dev/null
    DOCKER_EXISTS=$?

    if [ $DOCKER_EXISTS -ne 0 ]; then
        echo -e "${YELLOW}Warning: Docker not found, skipping container restart${NC}"
        echo -e "${YELLOW}Please restart the container manually if needed${NC}"
    else
        docker info &> /dev/null
        DOCKER_RUNNING=$?

        if [ $DOCKER_RUNNING -ne 0 ]; then
            echo -e "${YELLOW}Warning: Docker daemon not running, skipping container restart${NC}"
            echo -e "${YELLOW}Please start Docker and restart the container manually${NC}"
        else
            docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"
            CONTAINER_EXISTS=$?

            if [ $CONTAINER_EXISTS -eq 0 ]; then
                echo "Restarting container..."
                set -e
                docker restart "${CONTAINER_NAME}"
                sleep 3

                if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
                    echo -e "${GREEN}Restart successful!${NC}"
                else
                    echo -e "${RED}Container restarted but not running${NC}"
                    echo "Check logs: docker logs ${CONTAINER_NAME}"
                    exit 1
                fi
            else
                echo -e "${YELLOW}Warning: Container ${CONTAINER_NAME} not found, skipping restart${NC}"
                echo -e "${YELLOW}Config updated but container needs to be created${NC}"
            fi
        fi
    fi

    set -e
else
    echo ""
    echo -e "${YELLOW}Note: Config updated for current agent${NC}"
    echo -e "${YELLOW}Please restart OpenClaw for changes to take effect:${NC}"
    echo -e "${YELLOW}  openclaw restart${NC}"
fi

echo ""
echo "=========================================="
echo -e "${GREEN}Model switch complete!${NC}"
echo "=========================================="
echo "Target: ${NAME}"
echo "Model: ${PROVIDER}"
