# OpenConcho — nginx site config for the runtime container.
# Serves the React SPA from /usr/share/nginx/html with client-side routing.

server {
    listen       8080;
    listen       [::]:8080;
    server_name  _;
    root         /usr/share/nginx/html;
    index        index.html;

    # Don't leak the nginx version.
    server_tokens off;

    # Long-cache static assets — Vite hashes filenames so they're safely immutable.
    location ~* \.(?:js|mjs|css|woff2?|ttf|otf|eot|svg|png|jpg|jpeg|gif|ico|webp|avif|wasm)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
        try_files $uri =404;
    }

    # Healthcheck (no logging spam).
    location = /healthz {
        access_log off;
        default_type text/plain;
        return 200 "ok\n";
    }

    # --- Optional: same-origin Honcho reverse proxy (eliminates browser CORS) ---
    # The SPA's fetches are subject to browser CORS only on the web build (the
    # desktop app routes through Rust and bypasses CORS). To avoid configuring
    # CORS on Honcho itself, proxy the API under this origin and point the UI's
    # base URL at it. See docs/docker.md for the full tradeoff — note the UI
    # currently requires an absolute base URL, so this block is opt-in.
    #
    # location /honcho/ {
    #     proxy_pass         http://your-honcho-host:8000/;
    #     proxy_set_header   Host $host;
    #     proxy_set_header   X-Real-IP $remote_addr;
    #     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    #     proxy_set_header   X-Forwarded-Proto $scheme;
    # }

    # SPA fallback: any unknown path returns index.html so the router resolves it.
    location / {
        try_files $uri $uri/ /index.html;
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }

    # gzip text responses (Vite pre-compresses CSS/JS, but HTML still benefits).
    gzip on;
    gzip_types text/plain text/css application/javascript application/json image/svg+xml;
    gzip_min_length 1024;
}
