#!/bin/bash
# ====================================
# SCRIPT DE CONFIGURACIÓN DE ENTORNO
# Balotario Licencia A-I
# ====================================

set -e  # Salir en caso de error

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

# Función para imprimir con colores
print_info() {
    echo -e "${ $1${NC}"
}

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

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

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

print_header() {
    echo -e "${BLUE}"
    echo "======================================"
    echo "🌍 CONFIGURACIÓN DE ENTORNO"
    echo "Balotario Licencia A-I"
    echo "======================================"
    echo -e "${NC}"
}

# Función para generar SECRET_KEY
generate_secret_key() {
    if command -v python3 &> /dev/null; then
        python3 -c "import secrets; print(secrets.token_hex(32))"
    elif command -v python &> /dev/null; then
        python -c "import secrets; print(secrets.token_hex(32))"
    elif command -v openssl &> /dev/null; then
        openssl rand -hex 32
    else
        # Fallback básico
        date +%s | sha256sum | base64 | head -c 32
    fi
}

# Función para configurar desarrollo
setup_development() {
    print_info "Configurando entorno de desarrollo..."

    SECRET_KEY=$(generate_secret_key)

    cat > .env << EOF
# ====================================
# CONFIGURACIÓN DE DESARROLLO
# Generado automáticamente: $(date)
# ====================================

# Configuración de Flask
SECRET_KEY=${SECRET_KEY}
FLASK_ENV=development
FLASK_CONFIG=development
FLASK_DEBUG=true

# Configuración del servidor
HOST=127.0.0.1
PORT=5000

# Configuración de Docker
DOCKER_CONTAINER=false

# Configuración de logging
LOG_LEVEL=DEBUG
AUTO_RELOAD=true
SHOW_DEBUG_TOOLBAR=false

# ====================================
# NOTAS:
# - Cambia SECRET_KEY antes de ir a producción
# - Revisa .env.sample para más opciones
# ====================================
EOF

    print_success "Configuración de desarrollo creada en .env"
}

# Función para configurar producción
setup_production() {
    print_info "Configurando entorno de producción..."

    SECRET_KEY=$(generate_secret_key)

    cat > .env << EOF
# ====================================
# CONFIGURACIÓN DE PRODUCCIÓN
# Generado automáticamente: $(date)
# ====================================

# Configuración de Flask
SECRET_KEY=${SECRET_KEY}
FLASK_ENV=production
FLASK_CONFIG=production
FLASK_DEBUG=false

# Configuración del servidor
HOST=0.0.0.0
PORT=5000

# Configuración de Docker
DOCKER_CONTAINER=true

# Configuración de logging
LOG_LEVEL=INFO

# ====================================
# IMPORTANTE:
# - Guarda SECRET_KEY en lugar seguro
# - Revisa todas las configuraciones antes de desplegar
# - Considera usar variables de entorno del sistema
# ====================================
EOF

    print_success "Configuración de producción creada en .env"
    print_warning "IMPORTANTE: Guarda la SECRET_KEY en un lugar seguro"
}

# Función para configurar Docker
setup_docker() {
    print_info "Configurando entorno para Docker..."

    SECRET_KEY=$(generate_secret_key)

    cat > .env << EOF
# ====================================
# CONFIGURACIÓN PARA DOCKER
# Generado automáticamente: $(date)
# ====================================

# Configuración de Flask
SECRET_KEY=${SECRET_KEY}
FLASK_ENV=production
FLASK_CONFIG=production
FLASK_DEBUG=false

# Configuración del servidor
HOST=0.0.0.0
PORT=5000

# Configuración de Docker
DOCKER_CONTAINER=true

# Configuración de logging
LOG_LEVEL=INFO

# ====================================
# DOCKER NOTES:
# - Estas variables pueden ser sobrescritas en docker-compose.yml
# - Para desarrollo con Docker, cambia FLASK_ENV=development
# ====================================
EOF

    print_success "Configuración para Docker creada en .env"
}

# Función para validar configuración
validate_env() {
    print_info "Validando configuración..."

    if [ ! -f ".env" ]; then
        print_error "Archivo .env no encontrado"
        return 1
    fi

    # Verificar variables esenciales
    if ! grep -q "SECRET_KEY=" .env; then
        print_error "SECRET_KEY no encontrada en .env"
        return 1
    fi

    if ! grep -q "FLASK_ENV=" .env; then
        print_error "FLASK_ENV no encontrada en .env"
        return 1
    fi

    print_success "Configuración válida"

    # Mostrar resumen
    echo ""
    print_info "Resumen de configuración:"
    echo "------------------------"
    grep -E "^(SECRET_KEY|FLASK_ENV|FLASK_DEBUG|HOST|PORT)=" .env | while read line; do
        key=$(echo $line | cut -d'=' -f1)
        value=$(echo $line | cut -d'=' -f2)
        if [ "$key" = "SECRET_KEY" ]; then
            echo "  $key=***OCULTA***"
        else
            echo "  $key=$value"
        fi
    done
}

# Función para mostrar ayuda
show_help() {
    echo "Uso: $0 [COMANDO]"
    echo ""
    echo "Comandos disponibles:"
    echo "  dev        Configurar para desarrollo local"
    echo "  prod       Configurar para producción"
    echo "  docker     Configurar para Docker"
    echo "  validate   Validar configuración actual"
    echo "  backup     Crear backup de .env actual"
    echo "  restore    Restaurar desde .env.sample"
    echo "  help       Mostrar esta ayuda"
    echo ""
    echo "Ejemplos:"
    echo "  $0 dev      # Configuración de desarrollo"
    echo "  $0 prod     # Configuración de producción"
    echo "  $0 docker   # Configuración para Docker"
}

# Función para crear backup
backup_env() {
    if [ -f ".env" ]; then
        backup_file=".env.backup.$(date +%Y%m%d_%H%M%S)"
        cp .env "$backup_file"
        print_success "Backup creado: $backup_file"
    else
        print_warning "No hay archivo .env para respaldar"
    fi
}

# Función para restaurar desde sample
restore_env() {
    if [ -f ".env.sample" ]; then
        cp .env.sample .env
        print_success "Configuración restaurada desde .env.sample"
        print_warning "Recuerda personalizar los valores en .env"
    else
        print_error "Archivo .env.sample no encontrado"
        return 1
    fi
}

# Función principal
main() {
    print_header

    case "${1:-help}" in
        "dev"|"development")
            backup_env
            setup_development
            validate_env
            ;;
        "prod"|"production")
            backup_env
            setup_production
            validate_env
            ;;
        "docker")
            backup_env
            setup_docker
            validate_env
            ;;
        "validate"|"check")
            validate_env
            ;;
        "backup")
            backup_env
            ;;
        "restore")
            backup_env
            restore_env
            ;;
        "help"|"--help"|"-h")
            show_help
            ;;
        *)
            print_error "Comando desconocido: $1"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# Ejecutar función principal
main "$@"
