// Logger configuration builder — programmatic and from-simple-struct

///|
pub(all) struct LoggerConfig {
  level : Level
  enable_console : Bool
  console_json : Bool
  context_keys : Array[String]
  context_values : Array[String]
}

///|
pub fn LoggerConfig::new() -> LoggerConfig {
  LoggerConfig::{
    level: Level::TRACE,
    enable_console: false,
    console_json: false,
    context_keys: [],
    context_values: [],
  }
}

///|
pub fn LoggerConfig::set_level(self : LoggerConfig, l : Level) -> LoggerConfig {
  LoggerConfig::{ ..self, level: l }
}

///|
pub fn LoggerConfig::enable_console(self : LoggerConfig) -> LoggerConfig {
  LoggerConfig::{ ..self, enable_console: true }
}

///|
pub fn LoggerConfig::enable_console_json(self : LoggerConfig) -> LoggerConfig {
  LoggerConfig::{ ..self, enable_console: true, console_json: true }
}

///|
pub fn LoggerConfig::add_context(
  self : LoggerConfig,
  key : String,
  value : String,
) -> LoggerConfig {
  let new_keys = self.context_keys.copy()
  let new_values = self.context_values.copy()
  new_keys.push(key)
  new_values.push(value)
  LoggerConfig::{ ..self, context_keys: new_keys, context_values: new_values }
}

///|
pub fn LoggerConfig::build_logger(self : LoggerConfig) -> Logger {
  let logger = Logger::new().level(self.level)
  let logger2 = if self.enable_console {
    if self.console_json {
      logger.console_json()
    } else {
      logger.console()
    }
  } else {
    logger
  }
  let logger3 = build_context(
    logger2,
    self.context_keys,
    self.context_values,
    0,
  )
  logger3.build()
}

///|
fn build_context(
  logger : Logger,
  keys : Array[String],
  values : Array[String],
  idx : Int,
) -> Logger {
  if idx >= keys.length() {
    logger
  } else {
    let next = logger.add_context(keys[idx], values[idx])
    build_context(next, keys, values, idx + 1)
  }
}

// Named logger factory — creates pre-configured loggers

///|
pub fn create_dev_logger() -> Logger {
  LoggerConfig::new().set_level(Level::TRACE).enable_console().build_logger()
}

///|
pub fn create_prod_logger() -> Logger {
  LoggerConfig::new()
  .set_level(Level::INFO)
  .enable_console_json()
  .add_context("env", "production")
  .build_logger()
}

///|
pub fn create_test_logger() -> Logger {
  LoggerConfig::new().set_level(Level::DEBUG).build_logger()
}