# Vigía — imagen única que sirve la API REST y el panel web
# (docs/PLAN.md, fase 3.5).
#
# Un solo contenedor: FastAPI sirve la API bajo /api/v1 y /health, y el
# build estático del panel (web/dist) montado en / vía StaticFiles
# (ver src/vigia/api/app.py, `VIGIA_WEB_DIST`). Esto evita un segundo
# contenedor con nginx solo para servir archivos estáticos -- para cuatro
# pantallas no vale la pena el proxy aparte.
#
# `docker compose up` deja todo navegable en http://localhost:8000.

# ---- Etapa 1: build del frontend --------------------------------------
FROM node:22-slim AS web-build
WORKDIR /web
COPY web/package.json web/package-lock.json ./
RUN npm ci
COPY web/ ./
# VITE_API_BASE_URL vacío: el panel y la API comparten origen en este
# contenedor (mismo proceso, mismo puerto), así que las rutas relativas
# alcanzan y no hace falta hardcodear un host.
ENV VITE_API_BASE_URL=""
RUN npm run build

# ---- Etapa 2: runtime Python -------------------------------------------
FROM python:3.12-slim AS runtime

# Metadatos minimos; no instalamos herramientas de compilacion que no hacen
# falta en runtime (pyarrow y demas traen wheels precompilados para slim).
RUN apt-get update \
    && apt-get install -y --no-install-recommends curl \
    && rm -rf /var/lib/apt/lists/*

# Usuario sin privilegios (docs/PLAN.md, 3.5): nunca corremos como root.
RUN groupadd --system vigia && useradd --system --gid vigia --home-dir /app --shell /usr/sbin/nologin vigia

WORKDIR /app

# Instalar el paquete con el extra `api`. `parquet` va también: es el
# formato recomendado para encadenar auditorías (docs/USO.md) y sin
# pyarrow la API no podría leer .parquet subidos.
COPY pyproject.toml README.md ./
COPY src ./src
RUN pip install --no-cache-dir ".[api,parquet]"

# Panel estático ya compilado, en la ruta que `VIGIA_WEB_DIST` espera por
# defecto (web/dist relativo al directorio de trabajo del proceso).
COPY --from=web-build /web/dist ./web/dist

# Directorio para datasets/uploads temporales (docs/PLAN.md, 3.5): un
# volumen se monta acá desde docker-compose.yml. El propio storage.py usa
# `tempfile.mkdtemp`, así que esto es principalmente para dejar un punto de
# montaje estable y, si se quiere, apuntar TMPDIR ahí.
RUN mkdir -p /data/uploads && chown -R vigia:vigia /app /data

ENV TMPDIR=/data/uploads \
    PYTHONUNBUFFERED=1

USER vigia

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

CMD ["uvicorn", "vigia.api.app:app", "--host", "0.0.0.0", "--port", "8000"]
