# ---------------------------------------------------------------------------
# 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.
# ---------------------------------------------------------------------------
apiVersion: camel.apache.org/v1
kind: Kamelet
metadata:
  name: google-sheets-source
  annotations:
    camel.apache.org/kamelet.support.level: "Stable"
    camel.apache.org/catalog.version: "4.10.2"
    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA2NCA4OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNjQgODg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojMERDNTRDO30KCS5zdDF7ZmlsbDojMDg5NjJEO30KCS5zdDJ7ZmlsbDojRkRGRkZGO30KPC9zdHlsZT4KPGcgaWQ9IkxheWVyXzQiPgoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTU4LDg4SDZjLTMuMywwLTYtMi43LTYtNlY2YzAtMy4zLDIuNy02LDYtNmgzNmwyMiwyMnY2MEM2NCw4NS4zLDYxLjMsODgsNTgsODh6Ii8+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNNDIsMGwyMiwyMkg0MlYweiIvPgoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTEyLDM0LjV2MjhoNDB2LTI4SDEyeiBNMTcsMzkuNWgxMi41VjQ2SDE3VjM5LjV6IE0xNyw1MWgxMi41djYuNUgxN1Y1MXogTTQ3LDU3LjVIMzQuNVY1MUg0N1Y1Ny41eiBNNDcsNDYKCQlIMzQuNXYtNi41SDQ3VjQ2eiIvPgo8L2c+Cjwvc3ZnPgo="
    camel.apache.org/provider: "Apache Software Foundation"
    camel.apache.org/kamelet.group: "Google Sheets"
    camel.apache.org/kamelet.namespace: "GCP"
  labels:
    camel.apache.org/kamelet.type: "source"
spec:
  definition:
    title: "Google Sheets Source"
    description: |-
      Receive data from Google Sheets.
    required:
      - spreadsheetId
      - clientId
      - accessToken
      - refreshToken
      - clientSecret
    type: object
    properties:
      spreadsheetId:
        title: Spreadsheet ID
        description: The Spreadsheet ID to be used as events source
        type: string
      clientId:
        title: Client Id
        description: Client ID of the sheets application
        type: string
        format: password
        x-descriptors:
        - urn:camel:group:credentials
      clientSecret:
        title: Client Secret
        description: Client Secret of the sheets application
        type: string
        format: password
        x-descriptors:
        - urn:camel:group:credentials
      accessToken:
        title: Access Token
        description: OAuth 2 access token for google sheets application. This typically expires after an hour so refreshToken is recommended for long term usage.
        type: string
        format: password
        x-descriptors:
        - urn:camel:group:credentials
      refreshToken:
        title: Refresh Token
        description: OAuth 2 refresh token for google sheets application. Using this, the Google Calendar component can obtain a new accessToken whenever the current one expires - a necessity if the application is long-lived.
        type: string
        format: password
        x-descriptors:
        - urn:camel:group:credentials
      delay:
        title: Delay
        description: The number of milliseconds before the next poll
        type: integer
        default: 500
      repeatCount:
        title: Repeat Count
        description: Specifies a maximum limit of number of fires
        type: integer
      applicationName:
        title: Application name
        description: Google Sheets application name
        type: string
      splitResults:
        title: Split Results
        description: True if value range result should be split into rows or columns to process each of them individually.
        type: boolean
        default: true
      range:
        title: Cells Range
        description: The range of rows and columns in a sheet to get data from.
        type: string
        example: "A1:B3"
      majorDimension:
        title: Major Dimension
        description: Specifies the major dimension that the given values should use (ROWS or COLUMNS).
        type: string
        enum: [ "COLUMNS", "ROWS" ]
        default: "ROWS"
        example: "ROWS"
      columnNames:
        title: Column Names
        description: Optional custom column names that map to cell coordinates based on their position.
        type: string
        default: "A"
  dataTypes:
    out:
      default: json
      headers:
        CamelGoogleSheets.range:
          title: Range
          description: Cells range to write data to.
          default: A:A
          type: string
        CamelGoogleSheets.spreadsheetId:
          title: Spreadsheet id
          description: The Spreadsheet ID to be used as identifier.
          type: string
        CamelGoogleSheets.majorDimension:
          title: Major dimension
          description: Specifies the major dimension that the given values should use (ROWS or COLUMNS).
          default: ROWS
          type: string
        CamelGoogleSheets.columnNames:
          title: Column Names
          description: Optional custom column names that map to cell coordinates based on their position.
          default: A
          type: string
        CamelGoogleSheets.splitResults:
          title: Split Results
          description: True if value range result should be split into rows or columns to process each of them individually.
          default: "true"
          type: boolean
      types:
        json:
          format: "application-json"
          description: |-
            Json representation of a GoogleSheets ValueRange object that holds all values for the given cell range.
            Or Json array of values for a single row/column in the range when 'splitResults' mode is enabled.
          mediaType: application/json
        json-struct:
          format: "google-sheets:application-x-struct"
          description: |-
            Special Json representation of Google Sheets ValueRange object with just row and column values as a generic JsonNode.
            Each cell value is represented by a Json property named after the respective row (A-Z) or column (1-n) depending on the given majorDimension.
            Custom column names are supported in order to use custom property names instead of generic row (A-Z) or column (1-n) coordinates.
            The produced Json struct is ready to be transformed back into a proper Google Sheets ValueRange object that can be used in an update/append values operation.
          mediaType: application/json
        cloudevents:
          format: "google-sheets-stream:application-cloudevents"
          description: |-
            Output data type represents Google Sheets Stream response as CloudEvent V1. The data type sets Camel specific CloudEvent headers on the exchange with
            respective data from the Spreasheet and its derived object.
          headers:
            CamelCloudEventID:
              title: CloudEvent ID
              description: The Camel exchange id set as event id
              type: string
            CamelCloudEventType:
              title: CloudEvent Type
              description: The event type
              default: "org.apache.camel.event.google.sheets.stream.consume"
              type: string
            CamelCloudEventSource:
              title: CloudEvent Source
              description: The event source. By default, the Spreadsheet Id with prefix "google.sheets.stream.".
              type: string
            CamelCloudEventSubject:
              title: CloudEvent Subject
              description: The event subject. Usually the Spreadsheet URL.
              type: string
            CamelCloudEventTime:
              title: CloudEvent Time
              description: The exchange creation timestamp as event time.
              type: string
  dependencies:
  - "camel:core"
  - "camel:jackson"
  - "camel:kamelet"
  - "camel:google-sheets"
  template:
    from:
      uri: "google-sheets-stream://{{spreadsheetId}}"
      parameters:
        clientId: "{{clientId}}"
        accessToken: "{{accessToken}}"
        refreshToken: "{{refreshToken}}"
        clientSecret: "{{clientSecret}}"
        delay: "{{delay}}"
        applicationName: "{{?applicationName}}"
        splitResults: "{{splitResults}}"
        range: "{{?range}}"
        repeatCount: "{{?repeatCount}}"
      steps:
      - marshal:
          json: {}
      - setHeader:
          name: CamelGoogleSheets.spreadsheetId
          simple: "{{spreadsheetId}}"
      - setHeader:
          name: CamelGoogleSheets.range
          simple: "{{?range}}"
      - setHeader:
          name: CamelGoogleSheets.majorDimension
          simple: "{{?majorDimension}}"
      - setHeader:
          name: CamelGoogleSheets.columnNames
          simple: "{{?columnNames}}"
      - setHeader:
          name: CamelGoogleSheets.splitResults
          simple: "{{?splitResults}}"
      - to: "kamelet:sink"