#!/bin/bash

# Hotel MCP Server - Script de Instalación Automatizada
# Versión: 1.0
# Uso: ./scripts/install.sh

set -e  # Salir si cualquier comando falla

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Funciones de utilidad
print_step() {
    echo -e "${BLUE}[PASO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[✅]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[⚠️]${NC} $1"
}

print_error() {
    echo -e "${RED}[❌]${NC} $1"
}

# Verificar prerrequisitos
check_prerequisites() {
    print_step "Verificando prerrequisitos..."

    # Verificar Python 3.10+
    if ! command -v python3 &> /dev/null; then
        print_error "Python 3 no está instalado"
        exit 1
    fi

    python_version=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
    if [[ $(echo "$python_version < 3.10" | bc -l) -eq 1 ]]; then
        print_error "Se requiere Python 3.10+. Versión actual: $python_version"
        exit 1
    fi
    print_success "Python $python_version ✓"

    # Verificar uv
    if ! command -v uv &> /dev/null; then
        print_warning "uv no está instalado. Instalando..."
        curl -LsSf https://astral.sh/uv/install.sh | sh
        source ~/.bashrc 2>/dev/null || source ~/.zshrc 2>/dev/null || true
        if ! command -v uv &> /dev/null; then
            print_error "Error instalando uv. Instalar manualmente: https://docs.astral.sh/uv/"
            exit 1
        fi
    fi
    print_success "uv package manager ✓"

    # Verificar git
    if ! command -v git &> /dev/null; then
        print_error "Git no está instalado"
        exit 1
    fi
    print_success "Git ✓"
}

# Instalar dependencias
install_dependencies() {
    print_step "Instalando dependencias..."

    if [ ! -f "pyproject.toml" ]; then
        print_error "pyproject.toml no encontrado. ¿Estás en el directorio correcto?"
        exit 1
    fi

    uv sync
    print_success "Dependencias instaladas ✓"
}

# Configurar variables de entorno
setup_environment() {
    print_step "Configurando variables de entorno..."

    if [ ! -f ".env" ]; then
        if [ -f ".env.example" ]; then
            cp .env.example .env
            print_warning "Archivo .env creado desde .env.example"
            print_warning "IMPORTANTE: Edita .env con tus credenciales reales antes de continuar"

            # Preguntar si quiere configurar ahora
            read -p "¿Quieres configurar las variables de entorno ahora? (y/n): " -n 1 -r
            echo
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                configure_env_interactive
            else
                print_warning "Recuerda configurar .env antes de usar el servidor"
                return
            fi
        else
            print_error ".env.example no encontrado"
            exit 1
        fi
    else
        print_success "Archivo .env ya existe ✓"
    fi
}

# Configuración interactiva de variables de entorno
configure_env_interactive() {
    print_step "Configuración interactiva de variables de entorno..."

    # Leer SUPABASE_URL
    read -p "Ingresa tu SUPABASE_URL: " supabase_url
    if [ ! -z "$supabase_url" ]; then
        sed -i.bak "s|SUPABASE_URL=.*|SUPABASE_URL=$supabase_url|" .env
    fi

    # Leer SUPABASE_ANON_KEY
    read -p "Ingresa tu SUPABASE_ANON_KEY: " supabase_key
    if [ ! -z "$supabase_key" ]; then
        sed -i.bak "s|SUPABASE_ANON_KEY=.*|SUPABASE_ANON_KEY=$supabase_key|" .env
    fi

    # Leer DEFAULT_SITE_ID
    read -p "Ingresa tu DEFAULT_SITE_ID: " site_id
    if [ ! -z "$site_id" ]; then
        sed -i.bak "s|DEFAULT_SITE_ID=.*|DEFAULT_SITE_ID=$site_id|" .env
    fi

    # Limpiar archivos backup
    rm -f .env.bak

    print_success "Variables de entorno configuradas ✓"
}

# Ejecutar tests
run_tests() {
    print_step "Ejecutando tests..."

    # Tests básicos primero
    print_step "Ejecutando tests básicos..."
    if uv run pytest tests/ -x -q --tb=short; then
        print_success "Tests básicos pasaron ✓"
    else
        print_error "Tests básicos fallaron"
        exit 1
    fi

    # Tests de producción si .env está configurado
    if grep -q "tu_supabase_anon_key_here" .env 2>/dev/null; then
        print_warning "Variables de entorno no configuradas. Saltando tests de producción."
    else
        print_step "Ejecutando tests de producción..."
        if uv run pytest tests/test_production.py -x -q --tb=short; then
            print_success "Tests de producción pasaron ✓"
        else
            print_warning "Tests de producción fallaron. Verifica tu configuración de Supabase."
        fi
    fi
}

# Instalar en Claude Desktop
install_claude_desktop() {
    print_step "Configurando Claude Desktop..."

    # Detectar OS
    if [[ "$OSTYPE" == "darwin"* ]]; then
        config_path="$HOME/Library/Application Support/Claude/claude_desktop_config.json"
    elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
        config_path="$APPDATA/Claude/claude_desktop_config.json"
    else
        print_warning "OS no soportado para configuración automática de Claude Desktop"
        print_warning "Configura manualmente siguiendo README_PRODUCTION.md"
        return
    fi

    # Crear directorio si no existe
    mkdir -p "$(dirname "$config_path")"

    # Obtener ruta absoluta del proyecto
    project_path=$(pwd)

    # Crear configuración JSON
    cat > "$config_path" << EOF
{
  "mcpServers": {
    "hotel-mcp": {
      "command": "uv",
      "args": ["run", "python", "$project_path/hotel_mcp.py"],
      "env": {
        "SUPABASE_URL": "$(grep SUPABASE_URL .env | cut -d'=' -f2)",
        "SUPABASE_ANON_KEY": "$(grep SUPABASE_ANON_KEY .env | cut -d'=' -f2)",
        "DEFAULT_SITE_ID": "$(grep DEFAULT_SITE_ID .env | cut -d'=' -f2)",
        "DEFAULT_LANGUAGE": "$(grep DEFAULT_LANGUAGE .env | cut -d'=' -f2 || echo 'es')"
      }
    }
  }
}
EOF

    print_success "Claude Desktop configurado ✓"
    print_warning "IMPORTANTE: Reinicia Claude Desktop para aplicar los cambios"
}

# Verificar instalación
verify_installation() {
    print_step "Verificando instalación..."

    # Verificar que el servidor se puede importar
    if uv run python -c "from hotel_mcp import app; print('Hotel MCP Server importado correctamente')" 2>/dev/null; then
        print_success "Servidor MCP funcional ✓"
    else
        print_error "Error importando el servidor MCP"
        exit 1
    fi

    # Verificar herramientas disponibles
    tool_count=$(uv run python -c "from hotel_mcp import app; print(len(app.list_tools()))" 2>/dev/null || echo "0")
    if [ "$tool_count" -gt "0" ]; then
        print_success "$tool_count herramientas MCP disponibles ✓"
    else
        print_error "No se encontraron herramientas MCP"
        exit 1
    fi

    # Verificar recursos disponibles
    resource_count=$(uv run python -c "from hotel_mcp import app; print(len(app.list_resources()))" 2>/dev/null || echo "0")
    if [ "$resource_count" -gt "0" ]; then
        print_success "$resource_count recursos MCP disponibles ✓"
    else
        print_error "No se encontraron recursos MCP"
        exit 1
    fi
}

# Función principal
main() {
    echo -e "${BLUE}🏨 Hotel MCP Server - Instalación Automatizada${NC}"
    echo "=================================================="

    check_prerequisites
    install_dependencies
    setup_environment
    run_tests
    install_claude_desktop
    verify_installation

    echo
    echo -e "${GREEN}🎉 ¡Instalación completada exitosamente!${NC}"
    echo
    echo "Próximos pasos:"
    echo "1. Reinicia Claude Desktop"
    echo "2. Verifica que 'hotel-mcp' aparece en la lista de herramientas"
    echo "3. Prueba con: '¿Puedes mostrarme las habitaciones disponibles?'"
    echo
    echo "Para más información, consulta README_PRODUCTION.md"
}

# Ejecutar si es llamado directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi
