locals {
  command = distinct(compact(concat(
    [
      "/usr/local/bin/traefik",
    ],

    # API settings
    [
      "--api.insecure=${var.api_insecure || var.enable_dashboard ? "true" : "false"}", # @todo MB: Revisit this and swap to using traefik-ception routing
      "--api.dashboard=${var.enable_dashboard ? "true" : "false"}",
      "--api.debug=${var.api_debug ? "true" : "false"}",
    ],

    # Global settings
    [
      "--global.checknewversion=false", # We're in a container so this really isn't something we care about
      "--global.sendanonymoususage=${var.enable_stats_collection ? "true" : "false"}",
    ],

    # Logging settings
    [
      "--log.level=${var.log_level}",
      "--accesslog=${var.access_log ? "true" : "false"}",
      "--accesslog.format=${var.access_log_format}",
      "--accesslog.fields.defaultmode=${var.access_log_fields_default_mode}",
    ],

    # Ping settings
    var.enable_ping ? [
      "--ping=true",
      "--ping.entrypoint=${var.ping_entrypoint}",
    ] : [],

    # Docker Provider
    var.enable_docker_provider ? [
      "--providers.docker=true",
      "--providers.docker.exposedByDefault=false",
      "--providers.docker.network=${module.network.name}",
      "--providers.docker.endpoint=http://${module.docker_socket_proxy.docker_service.name}:2375",
      ] : [
      "--providers.docker=false"
    ],

    # Swarm Provider
    var.enable_swarm_provider ? [
      "--providers.swarm=true",
      "--providers.swarm.exposedByDefault=false",
      "--providers.swarm.network=${module.network.name}",
      "--providers.swarm.endpoint=http://${module.docker_socket_proxy.docker_service.name}:2375",
      ] : [
      "--providers.swarm=false"
    ],

    # Configure HTTP
    var.http_port != null || var.redirect_to_ssl ? [
      "--entrypoints.web.address=:${var.http_port}",
      "--entrypoints.web.reusePort=${var.enable_port_reuse ? "true" : "false"}",
    ] : [],

    # Configure HTTPS
    var.https_port != null && var.enable_ssl ? [
      "--entrypoints.websecure.address=:${var.https_port}",
      "--entrypoints.websecure.reusePort=${var.enable_port_reuse ? "true" : "false"}",
    ] : [],

    # Configure redirecting HTTP to HTTPS
    var.redirect_to_ssl ? [
      "--entrypoints.web.http.redirections.entrypoint.to=websecure",
      "--entrypoints.web.http.redirections.entrypoint.scheme=https",
    ] : [],

    # Configure the acme provider if SSL is enabled
    var.enable_ssl ? [
      "--certificatesresolvers.default.acme.tlschallenge=true",
      (var.acme_use_staging ? "--certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" : null),
      "--certificatesresolvers.default.acme.email=${var.acme_email}",
      "--certificatesresolvers.default.acme.storage=/certs/acme.json",
    ] : [],

    # Configure UDP
    var.enable_udp ? flatten([for name, ports in var.udp_entrypoints : [for port in ports : "--entrypoints.${name}.address=:${port}/udp"]]) : []
  )))
}
locals {
  traefik_parallelism = var.traefik_instance_count != null ? var.traefik_instance_count : 1
  traefik_global      = var.traefik_instance_count == null ? true : false
}
module "traefik" {
  source                = "../../docker/service"
  depends_on            = [module.docker_socket_proxy, module.network, ]
  stack_name            = var.stack_name
  service_name          = "traefik"
  image                 = var.traefik_image
  networks              = concat([module.network, module.docker_socket_proxy.network, ], var.extra_networks)
  volumes               = { "certs" = "/certs" }
  placement_constraints = var.placement_constraints
  global                = local.traefik_global
  parallelism           = local.traefik_parallelism
  healthcheck           = ["CMD", "wget", "--no-verbose", "--tries", 1, "--spider", "http://localhost:8080"]
  converge_enable       = true
  command               = local.command

  traefik = var.traefik_dashboard_service_domain != null ? {
    domain           = var.traefik_dashboard_service_domain
    port             = var.dashboard_port
    ssl              = var.enable_ssl
    non-ssl          = var.enable_non_ssl
    basic-auth-users = var.traefik_dashboard_service_enable_basic_auth ? ["traefik"] : []
  } : null
  ports = [
    {
      host         = var.http_port
      container    = var.http_port
      publish_mode = var.publish_mode
      }, {
      host         = var.https_port
      container    = var.https_port
      publish_mode = var.publish_mode
      }, {
      host         = var.dashboard_port
      container    = var.dashboard_port
      publish_mode = var.publish_mode
    },
  ]
}