# Protocole réellement vu par le client : celui annoncé par le proxy amont
# (Apache/cPanel ou Caddy) quand il y en a un, sinon celui de cette connexion.
map $http_x_forwarded_proto $client_proto {
    default $http_x_forwarded_proto;
    ""      $scheme;
}

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

    # Masque la version du serveur
    server_tokens off;

    # En-têtes de sécurité (doublés côté API pour les réponses JSON)
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://js.stripe.com; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob:; connect-src 'self' https://api.stripe.com; frame-src https://js.stripe.com https://hooks.stripe.com; frame-ancestors 'none'; base-uri 'none'; form-action 'self'; object-src 'none'" always;

    client_max_body_size 4m;   # photos de plats

    location /api/ {
        proxy_pass http://api: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;
        # Derrière Apache (cPanel), le protocole d'origine arrive dans l'en-tête :
        # sans cela, l'API se croit en HTTP et refuse les cookies « Secure ».
        proxy_set_header X-Forwarded-Proto $client_proto;
        proxy_read_timeout 30s;
    }

    # Photos des plats, servies par l'API depuis le volume partagé
    location /media/ {
        proxy_pass http://api:8000;
        proxy_set_header Host $host;
        expires 7d;
        add_header Cache-Control "public, max-age=604800";
    }

    location = /sw.js {
        add_header Cache-Control "no-cache";
    }

    # Code de l'application : revalidation systématique (ETag), pas de cache figé.
    location ~* \.(js|css|webmanifest)$ {
        add_header Cache-Control "no-cache" always;
    }

    # Images : elles changent de nom quand elles changent de contenu.
    location ~* \.(png|jpg|jpeg|webp|svg|ico)$ {
        expires 7d;
        add_header Cache-Control "public, max-age=604800" always;
    }

    location = /index.html {
        add_header Cache-Control "no-cache" always;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }
}
