# Server runtime configuration contracts
#
# Mirrors the Rust structs in rustelo_server/src/config/defs.rs.
# These contracts validate server, session, CORS, static files,
# directories, app, logging, redis, routing, cache, and RBAC path.

{
  ServerConfig = {
    protocol
      | String
      | doc "HTTP protocol: 'http' or 'https'"
      | default = "http",

    host
      | String
      | doc "Server bind address"
      | default = "0.0.0.0",

    port
      | Number
      | doc "Server port (1–65535)"
      | default = 3030,

    environment
      | String
      | doc "Runtime environment: 'development' or 'production'"
      | default = "development",

    log_level
      | String
      | doc "Log level: trace, debug, info, warn, error"
      | default = "info",
  },

  SessionConfig = {
    secret
      | String
      | doc "Session secret key — use '${SESSION_SECRET}' to read from env",

    cookie_name
      | String
      | default = "session_id",

    cookie_secure
      | Bool
      | doc "Require HTTPS for session cookies — set true in production"
      | default = false,

    cookie_http_only
      | Bool
      | default = true,

    cookie_same_site
      | String
      | doc "SameSite policy: 'lax', 'strict', or 'none'"
      | default = "lax",

    max_age
      | Number
      | doc "Session lifetime in seconds"
      | default = 3600,
  },

  CorsConfig = {
    allowed_origins
      | Array String
      | default = ["http://localhost:3030"],

    allowed_methods
      | Array String
      | default = ["GET", "POST", "PUT", "DELETE", "OPTIONS"],

    allowed_headers
      | Array String
      | default = ["Content-Type", "Authorization", "X-Requested-With"],

    allow_credentials
      | Bool
      | default = true,

    max_age
      | Number
      | doc "CORS preflight cache duration in seconds"
      | default = 3600,
  },

  StaticFilesConfig = {
    assets_dir
      | String
      | doc "Static assets directory (relative to root_path)"
      | default = "public",

    site_root
      | String
      | doc "cargo-leptos output directory"
      | default = "target/site",

    site_pkg_dir
      | String
      | doc "WASM/JS package subdirectory under site_root"
      | default = "pkg",
  },

  ServerDirConfig = {
    public_dir   | String | default = "public",
    uploads_dir  | String | default = "uploads",
    logs_dir     | String | default = "logs",
    temp_dir     | String | default = "tmp",
    cache_dir    | String | default = "cache",
    config_dir   | String | default = "config",
    data_dir     | String | default = "data",
    backup_dir   | String | default = "backups",
    template_dir | String | optional,
  },

  AppConfig = {
    name
      | String
      | default = "Website",

    version
      | String
      | default = "0.1.0",

    debug
      | Bool
      | default = true,

    enable_metrics
      | Bool
      | default = false,

    enable_health_check
      | Bool
      | default = true,

    enable_compression
      | Bool
      | default = true,

    max_request_size
      | Number
      | doc "Maximum request body size in bytes"
      | default = 10485760,

    admin_email
      | String
      | optional,
  },

  LoggingConfig = {
    format
      | String
      | doc "Log format: 'pretty' (dev) or 'json' (prod)"
      | default = "pretty",

    level
      | String
      | default = "debug",

    file_path
      | String
      | default = "logs/app.log",

    max_file_size
      | Number
      | doc "Log rotation threshold in bytes"
      | default = 10485760,

    max_files
      | Number
      | doc "Maximum rotated log files to keep"
      | default = 5,

    enable_console
      | Bool
      | default = true,

    enable_file
      | Bool
      | default = false,
  },

  RedisConfig = {
    enabled            | Bool   | default = false,
    url                | String | default = "redis://localhost:6379",
    pool_size          | Number | default = 10,
    connection_timeout | Number | default = 5,
    command_timeout    | Number | default = 5,
  },

  RoutingConfig = {
    enable_tracking              | Bool   | optional,
    tracking_log_path            | String | optional,
    max_events_in_memory         | Number | optional,
    slow_resolution_threshold_ms | Number | optional,
    enable_console_debug         | Bool   | optional,
    cache_max_entries            | Number | optional,
    cache_ttl_seconds            | Number | optional,
  },

  CacheConfig = {
    persistent_enabled
      | Bool
      | default = false,

    memory_enabled
      | Bool
      | default = true,

    memory_max_size
      | Number
      | doc "Memory cache capacity in bytes"
      | default = 104857600,

    memory_ttl
      | Number
      | doc "Memory cache TTL in seconds"
      | default = 3600,

    persistent_ttl
      | Number
      | doc "Persistent cache TTL in seconds"
      | default = 86400,

    persistent_max_size
      | Number
      | doc "Persistent cache max size in bytes"
      | default = 1073741824,

    persistent_cleanup_interval
      | Number
      | doc "Cleanup task interval in seconds"
      | default = 3600,
  },

  RbacNclConfig = {
    ncl_path
      | String
      | doc "Path to rbac.ncl policy file (hot-reloadable)"
      | default = "site/rbac.ncl",
  },
}
