#!/bin/bash
# Scripts de utilidades para Docker

set -e

# 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
log_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

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

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

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

# Función para construir la imagen
build() {
    log_info "Construyendo imagen Docker..."
    docker build -t balotario:latest .
    log_success "Imagen construida exitosamente"
}

# Función para ejecutar en desarrollo
dev() {
    log_info "Iniciando contenedor en modo desarrollo..."
    docker run -it --rm \
        -p 5000:5000 \
        -v $(pwd):/app \
        -e FLASK_ENV=development \
        -e FLASK_DEBUG=true \
        -e DOCKER_CONTAINER=true \
        --name balotario-dev \
        balotario:latest
}

# Función para ejecutar en producción
prod() {
    log_info "Iniciando contenedor en modo producción..."
    docker run -d \
        -p 5000:5000 \
        -e FLASK_ENV=production \
        -e FLASK_DEBUG=false \
        -e DOCKER_CONTAINER=true \
        --name balotario-prod \
        --restart unless-stopped \
        balotario:latest
    log_success "Contenedor iniciado en modo producción"
    log_info "Accede a: http://localhost:5000"
}

# Función para usar Docker Compose
compose_up() {
    log_info "Iniciando servicios con Docker Compose..."
    docker-compose up -d
    log_success "Servicios iniciados"
    log_info "Aplicación: http://localhost:5000"
    log_info "Nginx: http://localhost:80"
}

# Función para detener Docker Compose
compose_down() {
    log_info "Deteniendo servicios..."
    docker-compose down
    log_success "Servicios detenidos"
}

# Función para ver logs
logs() {
    local service=${1:-balotario}
    log_info "Mostrando logs de $service..."
    docker-compose logs -f $service
}

# Función para limpiar contenedores e imágenes
clean() {
    log_warning "Limpiando contenedores e imágenes..."

    # Detener contenedores
    docker stop balotario-dev balotario-prod 2>/dev/null || true
    docker rm balotario-dev balotario-prod 2>/dev/null || true

    # Limpiar con docker-compose
    docker-compose down --rmi all --volumes --remove-orphans 2>/dev/null || true

    # Limpiar imágenes huérfanas
    docker image prune -f

    log_success "Limpieza completada"
}

# Función para mostrar estado
status() {
    log_info "Estado de contenedores:"
    docker ps -a --filter "name=balotario"

    echo ""
    log_info "Estado de servicios Docker Compose:"
    docker-compose ps
}

# Función para entrar al contenedor
shell() {
    local container=${1:-balotario-prod}
    log_info "Entrando al contenedor $container..."
    docker exec -it $container /bin/bash
}

# Función de ayuda
help() {
    echo "🐳 Scripts de Docker para Balotario"
    echo ""
    echo "Uso: $0 <comando>"
    echo ""
    echo "Comandos disponibles:"
    echo "  build         - Construir imagen Docker"
    echo "  dev           - Ejecutar en modo desarrollo"
    echo "  prod          - Ejecutar en modo producción"
    echo "  compose-up    - Iniciar con Docker Compose"
    echo "  compose-down  - Detener Docker Compose"
    echo "  logs [service]- Ver logs (default: balotario)"
    echo "  clean         - Limpiar contenedores e imágenes"
    echo "  status        - Mostrar estado de contenedores"
    echo "  shell [name]  - Entrar al contenedor"
    echo "  help          - Mostrar esta ayuda"
    echo ""
    echo "Ejemplos:"
    echo "  $0 build"
    echo "  $0 compose-up"
    echo "  $0 logs nginx"
    echo "  $0 shell balotario-prod"
}

# Función principal
main() {
    case "${1:-help}" in
        build)
            build
            ;;
        dev)
            build
            dev
            ;;
        prod)
            build
            prod
            ;;
        compose-up)
            compose_up
            ;;
        compose-down)
            compose_down
            ;;
        logs)
            logs $2
            ;;
        clean)
            clean
            ;;
        status)
            status
            ;;
        shell)
            shell $2
            ;;
        help|*)
            help
            ;;
    esac
}

# Verificar que Docker esté instalado
if ! command -v docker &> /dev/null; then
    log_error "Docker no está instalado"
    exit 1
fi

# Ejecutar función principal
main "$@"
