# Origin Access Controls =====================================================

resource "aws_cloudfront_origin_access_control" "this" {
  for_each = var.origin_access_controls

  name                              = each.value.name
  description                       = each.value.description
  origin_access_control_origin_type = each.value.origin_access_control_origin_type
  signing_behavior                  = each.value.signing_behavior
  signing_protocol                  = each.value.signing_protocol
}

# CloudFront distributions ===================================================

resource "aws_cloudfront_distribution" "this" {
  for_each = var.distributions

  comment         = each.value.comment
  enabled         = each.value.enabled
  http_version    = each.value.http_version
  price_class     = each.value.price_class
  aliases         = each.value.aliases
  web_acl_id      = each.value.waf_web_acl_id
  is_ipv6_enabled = true

  dynamic "origin" {
    for_each = each.value.origins
    content {
      origin_id   = origin.value.origin_id
      domain_name = origin.value.domain_name
      origin_path = origin.value.origin_path

      origin_access_control_id = origin.value.s3_oac_id

      dynamic "custom_header" {
        for_each = origin.value.custom_headers
        content {
          name  = custom_header.key
          value = custom_header.value
        }
      }

      dynamic "custom_origin_config" {
        for_each = origin.value.custom_origin != null ? [origin.value.custom_origin] : []
        content {
          http_port              = custom_origin_config.value.http_port
          https_port             = custom_origin_config.value.https_port
          origin_protocol_policy = custom_origin_config.value.protocol_policy
          origin_ssl_protocols   = custom_origin_config.value.ssl_protocols
        }
      }
    }
  }

  default_cache_behavior {
    target_origin_id       = each.value.default_cache_behavior.target_origin_id
    viewer_protocol_policy = each.value.default_cache_behavior.viewer_protocol_policy
    allowed_methods        = each.value.default_cache_behavior.allowed_methods
    cached_methods         = each.value.default_cache_behavior.cached_methods
    compress               = each.value.default_cache_behavior.compress
    cache_policy_id        = each.value.default_cache_behavior.cache_policy_id

    dynamic "forwarded_values" {
      for_each = each.value.default_cache_behavior.cache_policy_id == null ? [true] : []
      content {
        query_string = false
        cookies { forward = "none" }
      }
    }

    min_ttl     = each.value.default_cache_behavior.ttl_min
    default_ttl = each.value.default_cache_behavior.ttl_default
    max_ttl     = each.value.default_cache_behavior.ttl_max
  }

  dynamic "ordered_cache_behavior" {
    for_each = each.value.ordered_cache_behaviors
    content {
      path_pattern           = ordered_cache_behavior.value.path_pattern
      target_origin_id       = ordered_cache_behavior.value.target_origin_id
      viewer_protocol_policy = ordered_cache_behavior.value.viewer_protocol_policy
      allowed_methods        = ordered_cache_behavior.value.allowed_methods
      cached_methods         = ordered_cache_behavior.value.cached_methods
      compress               = ordered_cache_behavior.value.compress
      cache_policy_id        = ordered_cache_behavior.value.cache_policy_id
      min_ttl                = ordered_cache_behavior.value.ttl_min
      default_ttl            = ordered_cache_behavior.value.ttl_default
      max_ttl                = ordered_cache_behavior.value.ttl_max

      dynamic "forwarded_values" {
        for_each = ordered_cache_behavior.value.cache_policy_id == null ? [true] : []
        content {
          query_string = false
          cookies { forward = "none" }
        }
      }
    }
  }

  restrictions {
    geo_restriction {
      restriction_type = each.value.geo_restriction.restriction_type
      locations        = each.value.geo_restriction.locations
    }
  }

  viewer_certificate {
    cloudfront_default_certificate = each.value.acm_certificate_arn == null
    acm_certificate_arn            = each.value.acm_certificate_arn
    ssl_support_method             = each.value.acm_certificate_arn != null ? "sni-only" : null
    minimum_protocol_version       = each.value.acm_certificate_arn != null ? "TLSv1.2_2021" : null
  }

  dynamic "logging_config" {
    for_each = each.value.logging_bucket != null ? [true] : []
    content {
      bucket          = each.value.logging_bucket
      prefix          = each.value.logging_prefix
      include_cookies = false
    }
  }

  tags = local.tags
}
