#!/usr/bin/env bash
#
# siac-opencode-setup.sh — Configura opencode para usar SIAC.
#
# Consulta los modelos aprobados para el usuario y genera ~/.config/opencode/opencode.json.
# Reejecutar cuando el administrador apruebe modelos nuevos.
#
set -euo pipefail

SIAC_URL="https://ia.siac.com.co/v1"
CONFIG_DIR="${HOME}/.config/opencode"
CONFIG_FILE="${CONFIG_DIR}/opencode.json"

echo "╔══════════════════════════════════════════════════╗"
echo "║   Configuración de opencode con SIAC              ║"
echo "╚══════════════════════════════════════════════════╝"
echo ""

# --- Obtener la clave de API ---
API_KEY="${SIAC_API_KEY:-}"
if [[ -z "$API_KEY" ]]; then
  echo "Pega tu clave de API de SIAC (empieza con sk-):"
  read -rs API_KEY
  echo ""
fi

if [[ -z "$API_KEY" ]]; then
  echo "✗ No se proporcionó ninguna clave. Abortando."
  exit 1
fi

# --- Verificar conexión ---
echo "→ Verificando conexión con SIAC..."
HEALTH=$(curl -sf "https://ia.siac.com.co/health" 2>/dev/null || echo "")
if [[ -z "$HEALTH" ]]; then
  echo "✗ No se puede conectar a https://ia.siac.com.co. Verifica tu conexión a internet."
  exit 1
fi
echo "✓ Conexión OK"
echo ""

# --- Consultar modelos aprobados ---
echo "→ Consultando modelos aprobados para tu usuario..."
MODELS_JSON=$(curl -sf "${SIAC_URL}/models" \
  -H "Authorization: Bearer ${API_KEY}" 2>/dev/null || echo "")

if [[ -z "$MODELS_JSON" ]]; then
  echo "✗ No se pudo consultar los modelos. Verifica que tu clave sea correcta."
  exit 1
fi

# --- Procesar con Python (disponible en la mayoría de sistemas) ---
echo "→ Generando configuración..."
CONFIG_JSON=$(python3 -c "
import json, sys

models_json = sys.stdin.read()
data = json.loads(models_json)
models = data.get('data', [])

if not models:
    print('ERROR_NO_MODELS', end='')
    sys.exit(0)

config = {
    '\$schema': 'https://opencode.ai/config.json',
    'provider': {
        'siac': {
            'npm': '@ai-sdk/openai-compatible',
            'name': 'SIAC',
            'options': {
                'baseURL': 'https://ia.siac.com.co/v1',
                'apiKey': '{env:SIAC_API_KEY}'
            },
            'models': {}
        }
    },
    'model': f'siac/{models[0][\"id\"]}'
}

for m in models:
    mid = m['id']
    # Precio efectivo del tenant (USD por 1M tokens). El servidor publica también las
    # tarifas de cache: para modelos normales cache_read/write = input (SIAC cobra
    # todos los prompt_tokens al precio de entrada); para el Modelo Automático
    # (siac-auto) cache_read = 1.0, porque el proxy informa el costo REAL de cada
    # respuesta como 'tokens de facturacion' (1 token = US\$0.000001) y asi opencode
    # muestra el consumo exacto en dolares aunque la tarifa del Automatico sea variable.
    in_price = m.get('input_per_1m_usd', 0)
    out_price = m.get('output_per_1m_usd', 0)
    cache_read = m.get('cache_read_per_1m_usd', in_price)
    cache_write = m.get('cache_write_per_1m_usd', in_price)
    config['provider']['siac']['models'][mid] = {
        'name': m.get('display_name', mid),
        'limit': {
            'context': m.get('context_limit', 128000),
            'output': 8192
        },
        'cost': {
            'input': in_price,
            'output': out_price,
            'cache_read': cache_read,
            'cache_write': cache_write
        }
    }

print(json.dumps(config, indent=2, ensure_ascii=False))
" <<< "$MODELS_JSON")

if [[ "$CONFIG_JSON" == "ERROR_NO_MODELS" ]]; then
  echo "✗ Tu usuario no tiene modelos aprobados. Pide al administrador que habilite al menos un modelo."
  exit 1
fi

if [[ -z "$CONFIG_JSON" ]]; then
  echo "✗ Error al procesar los modelos. Respuesta del servidor:"
  echo "$MODELS_JSON"
  exit 1
fi

# --- Crear directorio y escribir config ---
mkdir -p "$CONFIG_DIR"
echo "$CONFIG_JSON" > "$CONFIG_FILE"
echo "✓ Configuración guardada en: $CONFIG_FILE"
echo ""

# --- Configurar variable de entorno ---
echo "→ Configurando variable de entorno SIAC_API_KEY..."

SHELL_RC=""
if [[ -n "${ZSH_VERSION:-}" ]] || [[ "$SHELL" == */zsh ]]; then
  SHELL_RC="${HOME}/.zshrc"
elif [[ "$SHELL" == */bash ]]; then
  SHELL_RC="${HOME}/.bashrc"
else
  SHELL_RC="${HOME}/.bashrc"
fi

# Eliminar export anterior si existe
if [[ -f "$SHELL_RC" ]]; then
  sed -i '/^export SIAC_API_KEY=/d' "$SHELL_RC" 2>/dev/null || true
fi
echo "export SIAC_API_KEY=\"${API_KEY}\"" >> "$SHELL_RC"
echo "✓ Variable de entorno añadida a: $SHELL_RC"
echo ""

# --- Resumen ---
MODEL_COUNT=$(echo "$MODELS_JSON" | python3 -c "import sys,json; print(len(json.load(sys.stdin)['data']))")
DEFAULT_MODEL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['model'])")

echo "╔══════════════════════════════════════════════════╗"
echo "║   ✓ Configuración completada                      ║"
echo "╠══════════════════════════════════════════════════╣"
echo "║   Modelos configurados: $MODEL_COUNT                        ║"
echo "║   Modelo por defecto:   $DEFAULT_MODEL   ║"
echo "║   Config: $CONFIG_FILE"
echo "╚══════════════════════════════════════════════════╝"
echo ""
echo "Para usar opencode:"
echo "  1. Recarga tu shell:  source $SHELL_RC"
echo "  2. Abre un proyecto:  cd mi-proyecto"
echo "  3. Ejecuta:           opencode"
echo "  4. Selecciona el modelo SIAC"
echo ""
echo "Para actualizar cuando haya modelos nuevos, vuelve a ejecutar este script."
