#!/usr/bin/env bash
# Cline CLI Provider Configuration (Multi-Provider, Tier 2)
# Shell-sourceable config for loki-mode multi-provider support

# Provider Functions (for external use)
# =====================================
# These functions provide a clean interface for external scripts:
#   provider_detect()           - Check if CLI is installed
#   provider_version()          - Get CLI version
#   provider_invoke()           - Invoke with prompt (autonomous mode)
#   provider_invoke_with_tier() - Invoke with tier-specific model selection
#   provider_get_tier_param()   - Map tier name to model name
#
# Usage:
#   source providers/cline.sh
#   if provider_detect; then
#       provider_invoke "Your prompt here"
#   fi
#
# Note: autonomy/run.sh uses inline invocation for streaming support
# and real-time agent tracking. These functions are intended for
# simpler scripts, wrappers, and external integrations.
# =====================================

# Provider Identity
PROVIDER_NAME="cline"
PROVIDER_DISPLAY_NAME="Cline CLI (Multi-Provider)"
PROVIDER_CLI="cline"

# CLI Invocation
# Cline CLI v2.5+ uses -y / --yolo for autonomous mode
# Prompt is passed as positional argument
PROVIDER_AUTONOMOUS_FLAG="-y"
PROVIDER_PROMPT_FLAG=""
PROVIDER_PROMPT_POSITIONAL=true

# Skill System
# Cline does not have a native skills directory
PROVIDER_SKILL_DIR=""
PROVIDER_SKILL_FORMAT="none"

# Capability Flags
# Cline has subagents and MCP -- NOT fully degraded (Tier 2)
PROVIDER_HAS_SUBAGENTS=true
PROVIDER_HAS_PARALLEL=false
PROVIDER_HAS_TASK_TOOL=false
PROVIDER_HAS_MCP=true
PROVIDER_MAX_PARALLEL=1

# Model Configuration
# Cline supports 12+ providers; model configured via LOKI_CLINE_MODEL env var
# or `cline auth` one-time setup. Defaults are placeholders.
# NOTE: Cline uses its own model routing, so full model strings are needed (not CLI aliases)
# Cline default model -- reads from providers/model_catalog.json via models.sh when
# available so new model releases only require updating that single catalog file.
_cline_default_from_catalog() {
    local script_dir
    script_dir="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
    if [ -f "${script_dir}/models.sh" ]; then
        # shellcheck source=./models.sh
        source "${script_dir}/models.sh"
        loki_latest_model cline development 2>/dev/null || echo "claude-opus-4-8"
    else
        echo "claude-opus-4-8"
    fi
}
CLINE_DEFAULT_MODEL="${LOKI_CLINE_MODEL:-${LOKI_MODEL_DEVELOPMENT:-$(_cline_default_from_catalog)}}"
PROVIDER_MODEL_PLANNING="$CLINE_DEFAULT_MODEL"
PROVIDER_MODEL_DEVELOPMENT="$CLINE_DEFAULT_MODEL"
PROVIDER_MODEL_FAST="$CLINE_DEFAULT_MODEL"

# No Task tool - model is configured externally
PROVIDER_TASK_MODEL_PARAM=""
PROVIDER_TASK_MODEL_VALUES=()

# Context and Limits (varies by underlying provider, conservative defaults)
PROVIDER_CONTEXT_WINDOW=200000
PROVIDER_MAX_OUTPUT_TOKENS=128000
PROVIDER_RATE_LIMIT_RPM=60

# Cost (varies by underlying provider, not tracked by loki)
PROVIDER_COST_INPUT_PLANNING=0.003
PROVIDER_COST_OUTPUT_PLANNING=0.015
PROVIDER_COST_INPUT_DEV=0.003
PROVIDER_COST_OUTPUT_DEV=0.015
PROVIDER_COST_INPUT_FAST=0.003
PROVIDER_COST_OUTPUT_FAST=0.015

# Degraded Mode
# Cline is NOT degraded -- it has subagents and MCP (Tier 2: near-full)
PROVIDER_DEGRADED=false
PROVIDER_DEGRADED_REASONS=()

# Detection function - check if provider CLI is available
provider_detect() {
    command -v cline >/dev/null 2>&1
}

# Version check function
provider_version() {
    cline --version 2>/dev/null | head -1
}

# Invocation function
# Uses -y (YOLO) for autonomous mode, positional prompt
# BUG-PROV-009 fix: build model flag as array to prevent word-splitting on model
# names that contain spaces or special characters
provider_invoke() {
    local prompt="$1"
    shift
    local model="${LOKI_CLINE_MODEL:-}"
    local model_args=()
    [[ -n "$model" ]] && model_args=("-m" "$model")
    # Guard the model_args array expansion: when LOKI_CLINE_MODEL is unset the
    # array is empty, and a bare "${arr[@]}" under `set -u` aborts with "unbound
    # variable" on bash 3.2 (stock macOS /bin/bash). ${arr[@]+...} expands to
    # nothing when empty and preserves spaced elements otherwise.
    cline -y "${model_args[@]+"${model_args[@]}"}" "$prompt" "$@" 2>&1
}

# Model tier to parameter (Cline uses single model, returns model name)
provider_get_tier_param() {
    local tier="$1"
    echo "$CLINE_DEFAULT_MODEL"
}

# Dynamic model resolution (v6.0.0)
# Cline uses a single externally-configured model, so tier resolution
# just returns the configured model name. maxTier has no effect.
resolve_model_for_tier() {
    local tier="$1"
    echo "$CLINE_DEFAULT_MODEL"
}

# Tier-aware invocation
# Cline uses a single model configured externally, tier has no effect
provider_invoke_with_tier() {
    local tier="$1"
    local prompt="$2"
    shift 2
    provider_invoke "$prompt" "$@"
}
