# catalog/operations/vector/buffer.yaml

id: vector_buffer
name: Buffer
description: >
  Create buffer zones around vector geometries. Supports positive buffers
  (expansion) and negative buffers (erosion for polygons). Output is always
  polygon geometry.
version: 1.0.0
category: vector
type: vector-to-vector
default_implementation: native

inputs:
  - name: features
    type: vector
    format: geojson
    description: Input vector features (points, lines, or polygons)
    required: true

# Structural op — operates on any vector geometry uniformly.
requires: {}

outputs:
  - name: buffered
    type: vector
    format: geojson
    geometry: Polygon
    description: Buffered polygon features

params:
  distance:
    type: number
    required: true
    description: Buffer distance in meters
    min: -10000
    max: 100000
  cap_style:
    type: enum
    default: round
    enum: [round, flat, square]
    description: Style for line endpoints
  join_style:
    type: enum
    default: round
    enum: [round, mitre, bevel]
    description: Style for line corners
  resolution:
    type: integer
    default: 16
    description: Number of segments for circular arcs
    min: 1
    max: 128
  dissolve:
    type: boolean
    default: false
    description: Dissolve overlapping buffers into single geometry

# backends: audited 2026-08-14 (defect 50). A key means a runtime that DISPATCHES this op —
# folia-engine `dispatch_op` (products/sdk/folia-engine/src/lib.rs), a `registerOp`/OP_TABLE
# entry in packages/compute, `_BUILTIN_OP_MAP` in folia/compute.py, or a backend manifest
# (folia/backends/*/backend.yaml).
backends:
  js:
    function: vector_buffer
  python:
    function: geo.vector.buffer
    dispatch: folia/compute.py _BUILTIN_OP_MAP

display_hints:
  map:
    renderer: maplibre
    type: fill
    paint:
      fill-color: "rgba(100, 149, 237, 0.3)"
      fill-outline-color: "#6495ED"

cache_policy:
  ttl_days: 30
  invalidate_on: [source_update, param_change]
