# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

events {}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # Suppress per-request access logs; errors still go to error_log.
    access_log off;

    server {
        listen 8080;

        location /api/compile {
            proxy_pass http://workflow-compiling-service:9090;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/dataset {
            client_max_body_size 0;
            proxy_request_buffering off;
            proxy_pass http://file-service:9092;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/access/dataset/ {
            proxy_pass http://file-service:9092;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # Trailing slash for symmetry with /api/access/dataset/ above. The LLM route
        # is an exact match (location = /api/models), which outranks any prefix
        # location, so /api/models is unambiguous either way.
        location /api/model/ {
            client_max_body_size 0;
            proxy_request_buffering off;
            proxy_pass http://file-service:9092;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/access/model/ {
            proxy_pass http://file-service:9092;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/config {
            proxy_pass http://config-service:9094;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/computing-unit {
            proxy_pass http://workflow-computing-unit-managing-service:8888;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # LLM API traffic goes through access-control-service, which then forwards to LiteLLM.
        location = /api/models {
            proxy_pass http://access-control-service:9096;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/chat/ {
            proxy_pass http://access-control-service:9096;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/agents {
            proxy_pass http://agent-service:3001;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_read_timeout 1d;
            proxy_send_timeout 1d;
        }

        location /api/notebook-migration/ {
            proxy_pass http://notebook-migration-service:9098;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /api/pve/ {
            proxy_pass http://workflow-runtime-coordinator-service:8085;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # nginx prefix locations match by longest prefix
        location /api/ {
            proxy_pass http://dashboard-service:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /wsapi/ {
            proxy_pass http://workflow-runtime-coordinator-service:8085;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }

        # Fallback for all other routes
        location / {
            proxy_pass http://dashboard-service:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
