groups:
  - name: Syncthing Configuration
    description: Configure Syncthing
  - name: User and Group Configuration
    description: Configure User and Group for Syncthing
  - name: Network Configuration
    description: Configure Network for Syncthing
  - name: Storage Configuration
    description: Configure Storage for Syncthing
  - name: Resources Configuration
    description: Configure Resources for Syncthing

portals:
  web_portal:
    protocols:
      - "$kubernetes-resource_configmap_portal_protocol"
    host:
      - "$kubernetes-resource_configmap_portal_host"
    ports:
      - "$kubernetes-resource_configmap_portal_port"
    path: "$kubernetes-resource_configmap_portal_path"

questions:
  - variable: TZ
    group: Syncthing Configuration
    label: Timezone
    schema:
      type: string
      default: Etc/UTC
      required: true
      $ref:
        - definitions/timezone

  - variable: syncthingConfig
    label: ""
    group: Syncthing Configuration
    schema:
      type: dict
      attrs:
        # Boolean flags are currently
        # not exposed to the user
        - variable: natTraversal
          label: NAT Traversal
          schema:
            type: boolean
            default: false
            hidden: true
        - variable: localDiscovery
          label: Local Discovery
          schema:
            type: boolean
            default: false
            hidden: true
        - variable: globalDiscovery
          label: Global Discovery
          schema:
            type: boolean
            default: false
            hidden: true
        - variable: telemetry
          label: Telemetry
          schema:
            type: boolean
            default: false
            hidden: true
        - variable: relaying
          label: Relaying
          schema:
            type: boolean
            default: false
            hidden: true
        - variable: announceLANAddresses
          label: Announce LAN Addresses
          schema:
            type: boolean
            default: false
            hidden: true

        - variable: additionalEnvs
          label: Additional Environment Variables
          description: Configure additional environment variables for Syncthing.
          schema:
            type: list
            default: []
            items:
              - variable: env
                label: Environment Variable
                schema:
                  type: dict
                  attrs:
                    - variable: name
                      label: Name
                      schema:
                        type: string
                        required: true
                    - variable: value
                      label: Value
                      schema:
                        type: string
                        required: true

  - variable: syncthingID
    label: ""
    group: User and Group Configuration
    schema:
      type: dict
      attrs:
        - variable: user
          label: User ID
          description: The user id that Syncthing files will be owned by.
          schema:
            type: int
            min: 568
            default: 568
            immutable: true
            required: true
        - variable: group
          label: Group ID
          description: The group id that Syncthing files will be owned by.
          schema:
            type: int
            min: 568
            default: 568
            immutable: true
            required: true

  - variable: syncthingNetwork
    label: ""
    group: Network Configuration
    schema:
      type: dict
      attrs:
        - variable: hostNetwork
          label: Host Network
          description: |
            Bind to the host network.</br></br>
            If this is disabled, you will need to add your local networks in CIDR format to the Syncthing WebUI.</br>
            In the Syncthing WebUI, go to Advanced Settings > Options > Always Local Nets</br>
            Separate each CIDR network with a comma.</br>
            Example: 192.168.0.0/24,192.168.1.0/24
          schema:
            type: boolean
            default: true
        - variable: webPort
          label: Web Port
          description: The port for the Syncthing WebUI.
          schema:
            type: int
            default: 31000
            min: 9000
            max: 65535
            required: true
        - variable: tcpPort
          label: TCP Port (File Transfers)
          description: The TCP port for Syncthing transfers.
          schema:
            type: int
            show_if: [["hostNetwork", "=", false]]
            default: 22000
            min: 9000
            max: 65535
            required: true
        - variable: quicPort
          label: QUIC (UDP) Port (File Transfers)
          description: The QUIC (UDP) port for Syncthing transfers.
          schema:
            type: int
            show_if: [["hostNetwork", "=", false]]
            default: 22000
            min: 9000
            max: 65535
            required: true
        - variable: certificateID
          label: Certificate
          description: The certificate to use for Syncthing GUI.
          schema:
            type: int
            "null": true
            $ref:
              - "definitions/certificate"

  - variable: syncthingStorage
    label: ""
    group: Storage Configuration
    schema:
      type: dict
      attrs:
        - variable: home
          label: Syncthing Home Storage
          description: The path to store Syncthing Home Directory.
          schema:
            type: dict
            attrs:
              - variable: type
                label: Type
                description: |
                  ixVolume: Is dataset created automatically by the system.</br>
                  Host Path: Is a path that already exists on the system.
                schema:
                  type: string
                  required: true
                  immutable: true
                  default: "ixVolume"
                  enum:
                    - value: "hostPath"
                      description: Host Path (Path that already exists on the system)
                    - value: "ixVolume"
                      description: ixVolume (Dataset created automatically by the system)
              - variable: datasetName
                label: Dataset Name
                schema:
                  type: string
                  show_if: [["type", "=", "ixVolume"]]
                  required: true
                  hidden: true
                  immutable: true
                  default: "home"
                  $ref:
                    - "normalize/ixVolume"
              - variable: hostPath
                label: Host Path
                schema:
                  type: hostpath
                  show_if: [["type", "=", "hostPath"]]
                  immutable: true
                  required: true
        - variable: additionalStorages
          label: Additional Storage
          description: Additional storage for Syncthing.
          schema:
            type: list
            required: true
            empty: false
            default:
              - type: "hostPath"
                mountPath: "/data1"
                hostPath": ""
            items:
              - variable: storageEntry
                label: Storage Entry
                schema:
                  type: dict
                  attrs:
                    - variable: type
                      label: Type
                      description: |
                        Host Path: Is a path that already exists on the system.</br>
                        SMB Share: Mounts a persistent volume claim to a SMB share.
                      schema:
                        type: string
                        required: true
                        default: "hostPath"
                        immutable: true
                        enum:
                          - value: "hostPath"
                            description: Host Path (Path that already exists on the system)
                          - value: "smb-pv-pvc"
                            description: SMB Share (Mounts a persistent volume claim to a SMB share)
                    - variable: mountPath
                      label: Mount Path
                      description: The path inside the container to mount the storage.
                      schema:
                        type: path
                        required: true
                    - variable: hostPath
                      label: Host Path
                      description: The host path to use for storage.
                      schema:
                        type: hostpath
                        show_if: [["type", "=", "hostPath"]]
                        required: true
                    - variable: server
                      label: Server
                      description: The server for the SMB share.
                      schema:
                        type: string
                        show_if: [["type", "=", "smb-pv-pvc"]]
                        required: true
                    - variable: share
                      label: Share
                      description: The share name for the SMB share.
                      schema:
                        type: string
                        show_if: [["type", "=", "smb-pv-pvc"]]
                        required: true
                    - variable: domain
                      label: Domain (Optional)
                      description: The domain for the SMB share.
                      schema:
                        type: string
                        show_if: [["type", "=", "smb-pv-pvc"]]
                    - variable: username
                      label: Username
                      description: The username for the SMB share.
                      schema:
                        type: string
                        show_if: [["type", "=", "smb-pv-pvc"]]
                        required: true
                    - variable: password
                      label: Password
                      description: The password for the SMB share.
                      schema:
                        type: string
                        show_if: [["type", "=", "smb-pv-pvc"]]
                        required: true
                        private: true
                    - variable: size
                      label: Size (in Gi)
                      description: The size of the volume quota.
                      schema:
                        type: int
                        show_if: [["type", "=", "smb-pv-pvc"]]
                        required: true
                        min: 1
                        default: 1

  - variable: resources
    group: Resources Configuration
    label: ""
    schema:
      type: dict
      attrs:
        - variable: limits
          label: Limits
          schema:
            type: dict
            attrs:
              - variable: cpu
                label: CPU
                description: CPU limit for Syncthing.
                schema:
                  type: string
                  max_length: 6
                  valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$'
                  valid_chars_error: |
                    Valid CPU limit formats are</br>
                    - Plain Integer - eg. 1</br>
                    - Float - eg. 0.5</br>
                    - Milicpu - eg. 500m
                  default: "4000m"
                  required: true
              - variable: memory
                label: Memory
                description: Memory limit for Syncthing.
                schema:
                  type: string
                  max_length: 12
                  valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$'
                  valid_chars_error: |
                    Valid Memory limit formats are</br>
                    - Suffixed with E/P/T/G/M/K - eg. 1G</br>
                    - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi</br>
                    - Plain Integer in bytes - eg. 1024</br>
                    - Exponent - eg. 134e6
                  default: "8Gi"
                  required: true
