#!/usr/bin/env bash

###############################################################################
# Script de Configuración de OpenAI para AI Learning Platform (Bash)
# Uso:
#   ./setup-openai.sh --api-key "sk-..." --assistant-id "asst_..."
#   ./setup-openai.sh --reset
#   ./setup-openai.sh --help
###############################################################################

set -o errexit
set -o nounset
set -o pipefail

API_KEY=""
ASSISTANT_ID=""
RESET=false

# Nombres de contenedores (debe coincidir con docker-compose.yml)
POSTGRES_CONTAINER="ai-learning-platform-ewc-postgres"

print_help() {
  echo "Script de Configuración de OpenAI para AI Learning Platform"
  echo
  echo "Uso:"
  echo "  ./setup-openai.sh --api-key 'sk-...' --assistant-id 'asst_...'"
  echo "  ./setup-openai.sh --reset"
  echo "  ./setup-openai.sh --help"
  echo
  echo "Parámetros:"
  echo "  --api-key       API Key de OpenAI"
  echo "  --assistant-id  Assistant ID de OpenAI"
  echo "  --reset         Resetear configuración"
  echo "  --help          Mostrar ayuda"
  echo
  echo "Ejemplos:"
  echo "  ./setup-openai.sh --api-key 'sk-proj-abc123...' --assistant-id 'asst_xyz789...'"
}

# Parseo simple de argumentos
while [[ $# -gt 0 ]]; do
  case "$1" in
    --api-key)
      API_KEY="${2:-}"
      shift 2
      ;;
    --assistant-id)
      ASSISTANT_ID="${2:-}"
      shift 2
      ;;
    --reset)
      RESET=true
      shift
      ;;
    --help|-h)
      print_help
      exit 0
      ;;
    *)
      echo "Parámetro desconocido: $1" >&2
      echo
      print_help
      exit 1
      ;;
  esac
done

test_api_key() {
  local key="$1"
  [[ -n "${key//[[:space:]]/}" ]]
}

test_assistant_id() {
  local id="$1"
  [[ -n "${id//[[:space:]]/}" ]]
}

update_database() {
  local api_key="$1"
  local assistant_id="$2"

  echo "Actualizando base de datos..."

  # Verificar que el contenedor de PostgreSQL esté ejecutándose
  if ! docker ps --format '{{.Names}}' | grep -q "^${POSTGRES_CONTAINER}$"; then
    echo "Error: Contenedor de PostgreSQL no está ejecutándose" >&2
    echo "Ejecuta: docker-compose up -d postgres" >&2
    return 1
  fi

  # Desactivar todas las configuraciones anteriores
  echo "Desactivando configuraciones anteriores..."
  set +e
  docker exec "$POSTGRES_CONTAINER" psql -U postgres -d ai_learning_platform -c "UPDATE openai_config SET is_active = false WHERE is_active = true;" >/dev/null 2>&1
  set -e

  # Si los valores están vacíos (reset), solo desactivar y salir
  if [[ -z "$api_key" || -z "$assistant_id" ]]; then
    echo "Configuración desactivada exitosamente (reset)"
    return 0
  fi

  # Escapar comillas simples para SQL (PostgreSQL usa '' para escapar)
  local escaped_api_key
  local escaped_assistant_id
  escaped_api_key=${api_key//\'/\'\'}
  escaped_assistant_id=${assistant_id//\'/\'\'}

  # Generar UUID (requiere uuidgen en macOS/Linux)
  local uuid
  if command -v uuidgen >/dev/null 2>&1; then
    uuid=$(uuidgen)
  else
    # Fallback ligero con Python si no existe uuidgen
    if command -v python3 >/dev/null 2>&1; then
      uuid=$(python3 -c 'import uuid; print(uuid.uuid4())')
    else
      echo "No se encontró uuidgen ni python3 para generar UUID" >&2
      return 1
    fi
  fi

  # Insertar nueva configuración
  echo "Insertando nueva configuración..."
  set +e
  local result
  result=$(docker exec "$POSTGRES_CONTAINER" psql -U postgres -d ai_learning_platform -c "INSERT INTO openai_config (id, api_key, assistant_id, is_active, created_at, updated_at) VALUES ('${uuid}', '${escaped_api_key}', '${escaped_assistant_id}', true, NOW(), NOW());" 2>&1)
  local exit_code=$?
  set -e

  if [[ $exit_code -eq 0 ]]; then
    echo "Base de datos actualizada exitosamente"
    return 0
  else
    echo "Error actualizando base de datos: $result" >&2
    return 1
  fi
}

show_current_config() {
  echo "Verificando configuración actual..."
  
  # Verificar que el contenedor de PostgreSQL esté ejecutándose
  if ! docker ps --format '{{.Names}}' | grep -q "^${POSTGRES_CONTAINER}$"; then
    echo "  Contenedor de PostgreSQL no está ejecutándose"
    return
  fi

  set +e
  local result
  local count
  result=$(docker exec "$POSTGRES_CONTAINER" psql -U postgres -d ai_learning_platform -t -c "SELECT COUNT(*) FROM openai_config WHERE is_active = true;" 2>&1)
  local exit_code=$?
  set -e

  if [[ $exit_code -eq 0 ]]; then
    count=$(echo "$result" | tr -d '[:space:]')
    if [[ "$count" == "0" ]]; then
      echo "  No hay configuración activa"
    else
      echo "  Configuración encontrada: $count activa(s)"
    fi
  else
    echo "No se pudo obtener la configuración actual"
    echo "Error: $result" >&2
  fi
}

main() {
  echo "Configurador de OpenAI para AI Learning Platform"
  echo "==============================================="
  echo

  # Verificar Docker
  echo "Verificando Docker..."
  set +e
  docker-compose ps >/dev/null 2>&1
  local docker_status=$?
  set -e
  if [[ $docker_status -ne 0 ]]; then
    echo "Error: Docker no está ejecutándose"
    echo "Ejecuta: docker-compose up -d"
    exit 1
  fi
  echo "Docker está ejecutándose"

  # Mostrar configuración actual
  show_current_config
  echo

  if [[ "$RESET" == true ]]; then
    echo "Reseteando configuración..."
    API_KEY=""
    ASSISTANT_ID=""
  else
    # Solicitar API Key si no se proporcionó
    if ! test_api_key "$API_KEY"; then
      while true; do
        read -r -p "Ingresa tu OpenAI API Key: " API_KEY
        if test_api_key "$API_KEY"; then
          break
        else
          echo "API Key no puede estar vacía"
        fi
      done
    fi

    # Solicitar Assistant ID si no se proporcionó
    if ! test_assistant_id "$ASSISTANT_ID"; then
      while true; do
        read -r -p "Ingresa tu OpenAI Assistant ID: " ASSISTANT_ID
        if test_assistant_id "$ASSISTANT_ID"; then
          break
        else
          echo "Assistant ID no puede estar vacío"
        fi
      done
    fi
  fi

  # Mostrar configuración a aplicar (enmascarada)
  echo
  echo "Configuración a aplicar:"
  local api_key_masked assistant_id_masked
  api_key_masked="$([[ -n "$API_KEY" ]] && echo "${API_KEY:0:10}..." || echo "VACÍA")"
  assistant_id_masked="$([[ -n "$ASSISTANT_ID" ]] && echo "${ASSISTANT_ID:0:15}..." || echo "VACÍO")"
  echo "  API Key: ${api_key_masked}"
  echo "  Assistant ID: ${assistant_id_masked}"
  if [[ -n "$API_KEY" && -n "$ASSISTANT_ID" ]]; then
    echo "  Activo: SI"
  else
    echo "  Activo: NO"
  fi
  echo

  # Actualizar base de datos directamente
  if update_database "$API_KEY" "$ASSISTANT_ID"; then
    echo
    echo "¡Configuración de OpenAI completada!"
    echo "Verificando configuración final..."
    show_current_config
    echo
    echo "Próximos pasos:"
    echo "  1. Verifica en el panel de administración"
    echo "  2. Prueba la conexión con OpenAI"
    echo "  3. Ejecuta una conversación de prueba"
    echo
  else
    echo "Error actualizando base de datos" >&2
    exit 1
  fi
}

main "$@"


