/**
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

locals {
  ctx = {
    for k, v in var.context : k => {
      for kk, vv in v : "${local.ctx_p}${k}:${kk}" => vv
    }
  }
  ctx_p      = "$"
  project_id = lookup(local.ctx.project_ids, var.project_id, var.project_id)

  fwd_rule_names = {
    for k, v in var.forwarding_rules_config :
    k => k == "" ? var.name : "${var.name}-${k}"
  }
  fwd_rule_target = (
    var.protocol == "HTTPS"
    ? (
      var.use_classic_version
      ? google_compute_target_https_proxy.default[0].id
      : google_compute_target_https_proxy.new[0].id
    )
    : (
      var.use_classic_version
      ? google_compute_target_http_proxy.default[0].id
      : google_compute_target_http_proxy.new[0].id
    )
  )
  proxy_ssl_certificates = concat(
    coalesce(var.ssl_certificates.certificate_ids, []),
    [for k, v in google_compute_ssl_certificate.default : v.id],
    [for k, v in google_compute_managed_ssl_certificate.default : v.id]
  )
}

moved {
  from = google_compute_global_forwarding_rule.default
  to   = google_compute_global_forwarding_rule.default[""]
}

moved {
  from = google_compute_global_forwarding_rule.default
  to   = google_compute_global_forwarding_rule.default[""]
}

resource "google_compute_global_forwarding_rule" "default" {
  provider    = google-beta
  for_each    = var.forwarding_rules_config
  project     = var.project_id
  name        = coalesce(each.value.name, local.fwd_rule_names[each.key])
  description = each.value.description
  ip_address  = try(local.ctx.addresses[each.value.address], each.value.address)
  ip_protocol = "TCP"
  ip_version  = each.value.address != null ? null : each.value.ipv6 == true ? "IPV6" : "IPV4" # do not set if address is provided
  load_balancing_scheme = (
    var.use_classic_version ? "EXTERNAL" : "EXTERNAL_MANAGED"
  )
  port_range = join(",", (
    coalesce(each.value.ports, var.protocol == "HTTPS" ? [443] : [80])
  ))
  labels = var.labels
  target = local.fwd_rule_target
}

# certificates

resource "google_compute_ssl_certificate" "default" {
  for_each    = var.ssl_certificates.create_configs
  project     = var.project_id
  name        = "${var.name}-${each.key}"
  certificate = trimspace(each.value.certificate)
  private_key = trimspace(each.value.private_key)
}

resource "google_compute_managed_ssl_certificate" "default" {
  for_each    = var.ssl_certificates.managed_configs
  project     = local.project_id
  name        = coalesce(each.value.name, "${var.name}-${each.key}")
  description = each.value.description
  managed {
    domains = each.value.domains
  }
}

# proxies

resource "google_compute_target_http_proxy" "default" {
  count = (
    var.protocol == "HTTP" && var.use_classic_version ? 1 : 0
  )
  project     = local.project_id
  name        = coalesce(var.https_proxy_config.name, var.name)
  description = var.http_proxy_config.description
  url_map     = google_compute_url_map.default.id
}

resource "google_compute_target_https_proxy" "default" {
  count = (
    var.protocol == "HTTPS" && var.use_classic_version ? 1 : 0
  )
  project                          = local.project_id
  name                             = coalesce(var.https_proxy_config.name, var.name)
  description                      = var.https_proxy_config.description
  certificate_map                  = var.https_proxy_config.certificate_map
  certificate_manager_certificates = var.https_proxy_config.certificate_manager_certificates
  quic_override                    = var.https_proxy_config.quic_override
  ssl_certificates                 = length(local.proxy_ssl_certificates) == 0 ? null : local.proxy_ssl_certificates
  ssl_policy                       = var.https_proxy_config.ssl_policy
  url_map                          = google_compute_url_map.default.id
  server_tls_policy                = var.https_proxy_config.mtls_policy
}

resource "google_compute_target_http_proxy" "new" {
  count = (
    var.protocol == "HTTP" && !var.use_classic_version ? 1 : 0
  )
  project                     = local.project_id
  name                        = coalesce(var.http_proxy_config.name, var.name)
  description                 = var.http_proxy_config.description
  http_keep_alive_timeout_sec = var.http_proxy_config.http_keepalive_timeout
  url_map                     = google_compute_url_map.default.id
}

resource "google_compute_target_https_proxy" "new" {
  count = (
    var.protocol == "HTTPS" && !var.use_classic_version ? 1 : 0
  )
  project                          = local.project_id
  name                             = coalesce(var.https_proxy_config.name, var.name)
  description                      = var.https_proxy_config.description
  certificate_map                  = var.https_proxy_config.certificate_map
  certificate_manager_certificates = var.https_proxy_config.certificate_manager_certificates
  http_keep_alive_timeout_sec      = var.https_proxy_config.http_keepalive_timeout
  quic_override                    = var.https_proxy_config.quic_override
  ssl_certificates                 = length(local.proxy_ssl_certificates) == 0 ? null : local.proxy_ssl_certificates
  ssl_policy                       = var.https_proxy_config.ssl_policy
  url_map                          = google_compute_url_map.default.id
  server_tls_policy                = var.https_proxy_config.mtls_policy
}
