groups:
  - name: Terraria Configuration
    description: Configure Terraria
  - name: Network Configuration
    description: Configure Network for Terraria
  - name: Storage Configuration
    description: Configure Storage for Terraria
  - name: Resources Configuration
    description: Configure Resources for Terraria

questions:
  - variable: terrariaConfig
    label: ""
    group: Terraria Configuration
    schema:
      type: dict
      attrs:
        - variable: imageSelector
          label: Image Selector
          description: |
            Selects the image to use for the Terraria server.</br>
            TShock is a fork of the Terraria server that adds a number of features.</br>
            Vanilla is the original Terraria server. </br>
            Only applies to newly generated worlds.
          schema:
            type: string
            default: image
            required: true
            immutable: true
            enum:
              - value: image
                description: TShock
              - value: vanillaImage
                description: Vanilla
        - variable: worldName
          label: World Name
          description: |
            Sets the world's name.</br>
            Only applies to newly generated worlds.
          schema:
            type: string
            default: My-World
            required: true
            immutable: true
        - variable: worldSeed
          label: World Seed
          description: |
            Sets the world's seed.</br>
            Only applies to newly generated worlds.
          schema:
            type: string
            default: ''
            immutable: true
        - variable: worldEvil
          label: World's Evil
          description: |
            Sets the world's evil state.</br>
            Only applies to newly generated worlds.
          schema:
            type: string
            default: random
            required: true
            immutable: true
            enum:
              - value: random
                description: Random
              - value: corrupt
                description: Corrupt
              - value: crimson
                description: Crimson
        - variable: worldSize
          label: World Size
          description: |
            Sets the world's size.</br>
            Only applies to newly generated worlds.
          schema:
            type: string
            default: small
            required: true
            immutable: true
            enum:
              - value: small
                description: Small (1)
              - value: medium
                description: Medium (2)
              - value: large
                description: Large (3)
        - variable: worldDifficulty
          label: World Difficulty
          description: |
            Sets the world's difficulty.</br>
            Only applies to newly generated worlds.
          schema:
            type: string
            default: normal
            required: true
            immutable: true
            enum:
              - value: normal
                description: Normal (0)
              - value: expert
                description: Expert (1)
              - value: master
                description: Master (2)
              - value: journey
                description: Journey (3)
        - variable: maxPlayers
          label: Maximum Players
          description: Starts the server with the given player count as the maximum.
          schema:
            type: int
            default: 8
            min: 1
            max: 255
            required: true
        - variable: password
          label: Server Password
          description: Sets the server password.
          schema:
            type: string
            private: true
            default: ''
        - variable: secure
          label: Secure Server
          description: Turns on the base game's "anti-spam" feature.
          schema:
            type: boolean
            default: false
        - variable: forceUpdate
          label: Force Update
          description: |
            Forces the server to continue running, and not hibernating when no players are on. </br>
            This results in time passing, grass growing, and cpu running.
          schema:
            type: boolean
            default: false
        - variable: additionalEnvs
          label: Additional Environment Variables
          description: Configure additional environment variables for Terraria.
          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: additionalArgs
          label: Additional Arguments
          description: |
            Configure additional arguments for Terraria. </br>
            Value is optional for flags like -heaptile </br>
            For example: </br>
            Key: -lang </br>
            Value: en-US
          schema:
            type: list
            default: []
            items:
              - variable: arg
                label: Argument
                schema:
                  type: dict
                  attrs:
                    - variable: key
                      label: Key
                      schema:
                        type: string
                        required: true
                    - variable: value
                      label: Value
                      schema:
                        type: string

  - variable: terrariaNetwork
    label: ""
    group: Network Configuration
    schema:
      type: dict
      attrs:
        - variable: serverPort
          label: Server Port
          description: The port for the Terraria Server.
          schema:
            type: int
            default: 30030
            min: 9000
            max: 65535
            required: true
        - variable: hostNetwork
          label: Host Network
          description: |
            Bind to the host network. It's recommended to keep this disabled.</br>
          schema:
            type: boolean
            default: false

  - variable: terrariaStorage
    label: ""
    group: Storage Configuration
    schema:
      type: dict
      attrs:
        - variable: world
          label: Terraria World Storage
          description: The path to store Terraria World.
          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
                  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: "world"
                  $ref:
                    - "normalize/ixVolume"
              - variable: hostPath
                label: Host Path
                schema:
                  type: hostpath
                  show_if: [["type", "=", "hostPath"]]
                  immutable: true
                  required: true
        - variable: plugins
          label: Terraria Plugins Storage
          description: The path to store Terraria Plugins.
          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
                  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: "plugins"
                  $ref:
                    - "normalize/ixVolume"
              - variable: hostPath
                label: Host Path
                schema:
                  type: hostpath
                  show_if: [["type", "=", "hostPath"]]
                  immutable: true
                  required: true

  - 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 Terraria.
                schema:
                  type: string
                  default: "4000m"
                  required: true
              - variable: memory
                label: Memory
                description: Memory limit for Terraria.
                schema:
                  type: string
                  default: "8Gi"
                  required: true
