# ─────────────────────────────────────────────────────────────────────────────
# Leonex — Dockerfile para deploy en EasyPanel
# ─────────────────────────────────────────────────────────────────────────────
# Imagen ligera con Python 3.11. Build multi-stage para que la imagen final
# no incluya las herramientas de compilación.
# ─────────────────────────────────────────────────────────────────────────────

# ── Stage 1: builder con compilación de dependencias ────────────────────────
FROM python:3.11-slim AS builder

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1

# Dependencias del sistema para LightGBM, NumPy, pandas, etc.
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    gcc \
    g++ \
    libgomp1 \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /build

# Instalar dependencias Python en un venv aislado
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

COPY requirements.txt .
RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt


# ── Stage 2: runtime ligero ──────────────────────────────────────────────────
FROM python:3.11-slim

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PATH="/opt/venv/bin:$PATH" \
    LEONEX_ROOT=/app

# Solo runtime deps de LightGBM
RUN apt-get update && apt-get install -y --no-install-recommends \
    libgomp1 \
    curl \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# Usuario no-root por seguridad
RUN useradd -m -u 1000 leonex && \
    mkdir -p /app /app/data /app/logs /app/dashboard/data && \
    chown -R leonex:leonex /app

# Copiar venv del builder
COPY --from=builder /opt/venv /opt/venv

WORKDIR /app

# Cache-buster: cualquier cambio en este ARG fuerza a Docker a rebuildear
# todas las capas siguientes (incluido el COPY del codigo). Bumpealo cuando
# EasyPanel no detecte cambios en codigo y siga sirviendo la imagen vieja.
ARG REBUILD_TRIGGER=20260711-v9-journal-ux-clarity
RUN echo "Rebuild trigger ${REBUILD_TRIGGER}" > /tmp/rebuild_trigger.txt

# Copiar el código (respeta .dockerignore)
COPY --chown=leonex:leonex . /app/

USER leonex

# Crear .gitkeep para volúmenes
RUN touch /app/data/.gitkeep /app/logs/.gitkeep

# Puerto del dashboard HTTP server
EXPOSE 8765

# Healthcheck cada 30s: verifica que el server responde
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
    CMD curl -fsS http://localhost:8765/dashboard/index.html >/dev/null || exit 1

# Por defecto arranca el server HTTP. Para correr el pipeline use
# `docker run ... python actualizar_datos.py` o crons separados en EasyPanel.
# --host 0.0.0.0 es CRITICO en contenedores para que el proxy externo pueda
# alcanzar el servicio (en localhost solo no llegarían las requests).
CMD ["python", "leonex_server.py", "--host", "0.0.0.0", "--port", "8765"]
