# Resource Validators
# CPU, memory, and disk allocation validation for deployment modes

let constraints = import "../constraints/constraints.toml" in
let common = import "./common-validator.ncl" in

{
  # Validate CPU cores for deployment mode
  ValidCpuCores = fun mode cpu_cores =>
    let min_cpu = constraints.deployment.solo.cpu.min in
    let max_cpu = constraints.deployment.enterprise.cpu.max in
    common.ValidRange min_cpu max_cpu cpu_cores,

  # Validate memory allocation in MB for deployment mode
  ValidMemoryMb = fun mode memory_mb =>
    let min_mem = constraints.deployment.solo.memory_mb.min in
    let max_mem = constraints.deployment.enterprise.memory_mb.max in
    common.ValidRange min_mem max_mem memory_mb,

  # Validate disk allocation in GB for deployment mode
  ValidDiskGb = fun mode disk_gb =>
    let min_disk = constraints.deployment.solo.disk_gb.min in
    let max_disk = constraints.deployment.enterprise.disk_gb.max in
    common.ValidRange min_disk max_disk disk_gb,

  # Validate file size in bytes
  ValidFileSize = fun min_bytes max_bytes size =>
    common.ValidRange min_bytes max_bytes size,

  # Validate memory size in MB
  ValidMemorySizeMb = fun min_mb max_mb size_mb =>
    common.ValidRange min_mb max_mb size_mb,

  # Validate pool size (number of connections/threads)
  ValidPoolSize = fun pool_size =>
    if pool_size < 1 then
      std.contract.blame_with_message "Pool size must be >= 1" pool_size
    else if pool_size > 1000 then
      std.contract.blame_with_message "Pool size must be <= 1000" pool_size
    else
      pool_size,
}
