{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://gogo-cycle-mqtt-stg.fly.dev/event.schema.json",
  "title": "stationStatusUpdatePayload",
  "description": "シェアサイクル ポート共有MQTT(M15-IF-120)のイベントペイロード。COMmmmONS標準 002-07-02 v1.1.0 の components.schemas.stationStatusUpdatePayload に準拠。",
  "type": "object",
  "required": ["event_id", "event_type", "source_partner_id", "timestamp", "payload"],
  "additionalProperties": true,
  "properties": {
    "event_id": {
      "type": "string",
      "pattern": "^(gogoshare|emobi|lovedrive|jtech)-[0-9a-f]{8}-[0-9a-f]{4}-8[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
      "description": "通知の一意ID(重複排除に使用)。形式: {自社partner_id}-{UUID v8}。接頭辞はsource_partner_idと一致させる。UUID v8の内部レイアウトは事業者の自由(仕様書§4.3)",
      "examples": ["emobi-017f22e2-79b0-8cc3-98c4-dc0c0c07398f"]
    },
    "event_type": {
      "type": "string",
      "enum": ["station.status_updated", "ride.started", "ride.updated", "ride.terminated"],
      "description": "通知の種類。初版の同期対象は station.status_updated のみ(ride系は任意)"
    },
    "source_partner_id": {
      "type": "string",
      "enum": ["gogoshare", "emobi", "lovedrive", "jtech"],
      "description": "発生源の事業者ID。トピックの {source_partner_id} と一致させること(原本: m_company.system_id)"
    },
    "timestamp": {
      "type": "string",
      "format": "date-time",
      "pattern": "Z$|[+-][0-9]{2}:[0-9]{2}$",
      "description": "イベント発生時刻。UTCのRFC3339(例 2026-08-18T10:30:00Z)。受信側の新旧判定に使用(原本: t_station_status.updated_at)"
    },
    "payload": {
      "type": "object",
      "required": ["station_id", "num_vehicles_available", "num_docks_available"],
      "additionalProperties": true,
      "properties": {
        "station_id": {
          "type": "string",
          "minLength": 1,
          "description": "ポートID。トピックの {station_id} と一致させること(原本: m_station.station_id)"
        },
        "num_vehicles_available": {
          "type": "integer",
          "minimum": 0,
          "description": "貸出可能台数(原本: t_station_status.num_vehicles_available)"
        },
        "num_docks_available": {
          "type": "integer",
          "minimum": 0,
          "description": "返却可能ドック数(原本: t_station_status.num_docks_available)"
        },
        "reason_code": {
          "type": "string",
          "enum": ["VEHICLE_RETURNED", "REBALANCE_DROP_OFF", "REBALANCE_PICK_UP", "MAINTENANCE_OUT", "VEHICLE_RENTED"],
          "description": "変動理由(任意)。VEHICLE_RETURNED=ユーザーによる車両返却 / REBALANCE_DROP_OFF=再配置による入庫 / REBALANCE_PICK_UP=再配置による出庫 / MAINTENANCE_OUT=故障対応等による回収 / VEHICLE_RENTED=ユーザーによる車両貸出(本事業の拡張値。標準原本には無い。仕様書 v1.5 で追加)。受信側は未知の値を無視し、台数の値だけで状態を更新すること"
        }
      }
    }
  },
  "examples": [
    {
      "event_id": "emobi-017f22e2-79b0-8cc3-98c4-dc0c0c07398f",
      "event_type": "station.status_updated",
      "source_partner_id": "emobi",
      "timestamp": "2026-08-18T10:30:00Z",
      "payload": {
        "station_id": "1234",
        "num_vehicles_available": 5,
        "num_docks_available": 10,
        "reason_code": "VEHICLE_RETURNED"
      }
    }
  ]
}
