# Nickel Schema: Array Types with RepeatingGroup Integration
#
# This example demonstrates how TypeDialog's RepeatingGroup field type
# integrates with Nickel's Array(Record) types for managing collections
# of structured data.

{
  # ========================================================
  # Record Types (Reusable Structures)
  # ========================================================

  # UDP Tracker listener configuration
  TrackerUdp = {
    # Bind address for UDP listener (e.g., "0.0.0.0:6969")
    bind_address | String,

    # Number of worker threads (optional)
    workers | Number | default = 4,
  },

  # HTTP Tracker listener configuration
  TrackerHttp = {
    # Bind address for HTTP listener (e.g., "0.0.0.0:7070")
    bind_address | String,

    # Protocol: http or https
    protocol | [| 'http, 'https |] | default = 'http,

    # Number of worker threads (optional)
    workers | Number | default = 8,
  },

  # API Endpoint configuration
  ApiEndpoint = {
    # Endpoint path (e.g., "/api/v1")
    path | String,

    # Enable authentication on this endpoint
    require_auth | Bool | default = true,

    # Rate limit (requests per minute)
    rate_limit | Number | default = 100,
  },

  # User/Account configuration
  User = {
    # Username (must be alphanumeric with underscores)
    username | String,

    # Email address
    email | String,

    # User role
    role | [| 'admin, 'moderator, 'user |] | default = 'user,

    # Is account active
    active | Bool | default = true,
  },

  # ========================================================
  # Main Configuration (Maps to Form)
  # ========================================================

  Config = {
    # ~~~~~ Tracker Configuration ~~~~~

    # Tracker mode: public or private
    tracker_mode | [| 'public, 'private |],

    # Array of UDP tracker listeners
    # In TypeDialog: RepeatingGroup field with fragment defining TrackerUdp fields
    # User can add/edit/delete multiple UDP trackers
    udp_trackers | Array TrackerUdp | optional,

    # Array of HTTP tracker listeners
    # In TypeDialog: RepeatingGroup field with fragment defining TrackerHttp fields
    http_trackers | Array TrackerHttp | optional,

    # ~~~~~ API Configuration ~~~~~

    # Admin API token for authentication
    api_token | String,

    # API port number (1024-65535)
    api_port | Number,

    # Array of API endpoints exposed by the service
    # In TypeDialog: RepeatingGroup field with fragment defining ApiEndpoint fields
    api_endpoints | Array ApiEndpoint | optional,

    # ~~~~~ User Management ~~~~~

    # Array of users/accounts
    # In TypeDialog: RepeatingGroup field with fragment defining User fields
    # Admin can add/edit/delete user accounts
    users | Array User | optional,

    # ~~~~~ Optional Features ~~~~~

    # Enable metrics collection
    enable_metrics | Bool | default = false,

    # Enable logging (if enabled, requires log_level)
    enable_logging | Bool | default = true,

    # Log level if logging is enabled
    log_level | [| 'debug, 'info, 'warn, 'error |]
      | default = 'info
      | std.function.optional_if (! enable_logging),
  },

  # ========================================================
  # Export the main configuration as default
  # ========================================================

  Config
}
