{
  "openapi": "3.1.0",
  "info": {
    "title": "LiveMap Routing Facade",
    "version": "11.0-livemap-1.0"
  },
  "paths": {
    "/api/routing/route": {
      "post": {
        "summary": "Calculate one route per requested LiveMap product profile",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/RouteRequest" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Routing result or route-domain failure",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    { "$ref": "#/components/schemas/OkRouteResponse" },
                    { "$ref": "#/components/schemas/NoRouteResponse" }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid request body, profile, or bucket",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ErrorResponse" }
              }
            }
          },
          "500": {
            "description": "Misconfigured profile catalog or unexpected server error",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ErrorResponse" }
              }
            }
          }
        }
      }
    },
    "/api/routing/openapi.json": {
      "get": {
        "summary": "Return this OpenAPI document",
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 JSON document",
            "content": {
              "application/json": {
                "schema": { "type": "object" }
              }
            }
          }
        }
      }
    },
    "/api/routing/profiles": {
      "get": {
        "summary": "Return the configured LiveMap product profile catalog",
        "responses": {
          "200": {
            "description": "Profile catalog keyed by product profile name",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": { "$ref": "#/components/schemas/ProductProfile" }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "RouteRequest": {
        "type": "object",
        "required": ["points", "profiles"],
        "additionalProperties": false,
        "properties": {
          "points": {
            "type": "array",
            "minItems": 2,
            "items": { "$ref": "#/components/schemas/LngLat" }
          },
          "profiles": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": ["foot_fast", "foot_safe", "foot_green"]
            }
          },
          "bucket": { "$ref": "#/components/schemas/Bucket" },
          "debug": {
            "type": "boolean",
            "default": false,
            "description": "Internal direct-use only. The frontend API does not need to forward this."
          }
        }
      },
      "LngLat": {
        "type": "array",
        "prefixItems": [
          { "type": "number", "minimum": -180, "maximum": 180 },
          { "type": "number", "minimum": -90, "maximum": 90 }
        ],
        "minItems": 2,
        "maxItems": 2
      },
      "Bucket": {
        "type": "string",
        "default": "auto",
        "enum": ["auto", "wd_am", "wd_pm", "wd_nt", "we_am", "we_pm", "we_nt"]
      },
      "OkRouteResponse": {
        "type": "object",
        "required": ["status", "resolvedBucket", "routes"],
        "properties": {
          "status": { "const": "ok" },
          "resolvedBucket": { "$ref": "#/components/schemas/ResolvedBucket" },
          "routes": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/Route" }
          }
        }
      },
      "NoRouteResponse": {
        "type": "object",
        "required": ["status", "resolvedBucket", "routes", "routeErrors"],
        "properties": {
          "status": { "const": "no_route" },
          "resolvedBucket": { "$ref": "#/components/schemas/ResolvedBucket" },
          "routes": {
            "type": "array",
            "maxItems": 0
          },
          "routeErrors": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/RouteError" }
          }
        }
      },
      "ResolvedBucket": {
        "type": "string",
        "enum": ["wd_am", "wd_pm", "wd_nt", "we_am", "we_pm", "we_nt"]
      },
      "Route": {
        "type": "object",
        "required": ["profile", "distanceMeters", "timeMillis", "geometry"],
        "properties": {
          "profile": {
            "type": "string",
            "enum": ["foot_fast", "foot_safe", "foot_green"]
          },
          "distanceMeters": { "type": "number" },
          "timeMillis": { "type": "integer", "format": "int64" },
          "geometry": { "$ref": "#/components/schemas/LineString" },
          "debug": {
            "type": "object",
            "additionalProperties": true,
            "description": "Only present when direct callers pass debug: true."
          }
        }
      },
      "LineString": {
        "type": "object",
        "required": ["type", "coordinates"],
        "properties": {
          "type": { "const": "LineString" },
          "coordinates": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/LngLat" }
          }
        }
      },
      "RouteError": {
        "type": "object",
        "required": ["profile", "code", "message"],
        "properties": {
          "profile": {
            "type": "string",
            "enum": ["foot_fast", "foot_safe", "foot_green"]
          },
          "code": { "type": "string", "enum": ["NO_ROUTE", "ROUTE_ERROR"] },
          "message": { "type": "string" }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": ["status", "code", "message"],
        "properties": {
          "status": { "const": "error" },
          "code": { "type": "string" },
          "message": { "type": "string" }
        }
      },
      "ProductProfile": {
        "type": "object",
        "required": ["base_profile", "weights"],
        "properties": {
          "base_profile": { "type": "string" },
          "weights": { "$ref": "#/components/schemas/ProfileWeights" }
        }
      },
      "ProfileWeights": {
        "type": "object",
        "required": ["tree", "lights", "accident", "crime", "presence"],
        "properties": {
          "tree": { "type": "number", "minimum": 0, "maximum": 1 },
          "lights": { "type": "number", "minimum": 0, "maximum": 1 },
          "accident": { "type": "number", "minimum": 0, "maximum": 1 },
          "crime": { "type": "number", "minimum": 0, "maximum": 1 },
          "presence": { "type": "number", "minimum": 0, "maximum": 1 }
        }
      }
    }
  }
}
