resource "aws_cloudfront_origin_access_identity" "docs_access_identity" {
  comment = "Cloudfront access identity for accessing bucket ${aws_s3_bucket.docs_bucket.id}"
}

resource "aws_cloudfront_distribution" "docs_cdn" {
  enabled      = true
  web_acl_id   = module.aws_waf.wafv2_web_acl.arn
  price_class  = "PriceClass_100"
  http_version = "http2"
  aliases      = [module.domains[local.env_prefix]["swagger"]]

  logging_config {
    include_cookies = false
    bucket          = data.aws_s3_bucket.security_logs.bucket_domain_name
    prefix          = "cf/${local.name_prefix}-docs"
  }

  origin {
    origin_id   = "origin-bucket-${aws_s3_bucket.docs_bucket.id}"
    domain_name = aws_s3_bucket.docs_bucket.bucket_regional_domain_name

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.docs_access_identity.cloudfront_access_identity_path
    }
  }

  default_root_object = "index.html"

  default_cache_behavior {
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    target_origin_id       = "origin-bucket-${aws_s3_bucket.docs_bucket.id}"
    min_ttl                = "0"
    default_ttl            = "3600"
    max_ttl                = "86400"
    viewer_protocol_policy = "redirect-to-https"
    compress               = true

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  viewer_certificate {
    acm_certificate_arn      = data.aws_acm_certificate.wildcard_atlas_stream_cert.arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021"
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "Core",
      service                  = "Cloudfront",
      plat_env_project_service = "${local.aggregated_tag}_CORE_CFR"
    }
  )

  depends_on = [
    module.aws_waf
  ]
}

resource "aws_route53_record" "docs_bucket_domain_record" {
  provider = aws.gdb-core-dev
  zone_id  = data.aws_route53_zone.atlas_stream_zone.id
  name     = module.domains[local.env_prefix]["swagger"]
  type     = "A"

  alias {
    name                   = aws_cloudfront_distribution.docs_cdn.domain_name
    zone_id                = aws_cloudfront_distribution.docs_cdn.hosted_zone_id
    evaluate_target_health = false
  }
}

resource "aws_cloudfront_origin_access_identity" "static_files_access_identity" {
  comment = "Cloudfront access identity for accessing bucket ${module.static_files.bucket.id}"
}

resource "aws_cloudfront_distribution" "static_files_cdn" {
  enabled      = true
  price_class  = "PriceClass_100"
  http_version = "http2"
  aliases      = [module.domains[local.env_prefix]["atlas-um-static"]]
  web_acl_id   = data.aws_wafv2_web_acl.ioc_web_acl_global.arn

  logging_config {
    include_cookies = false
    bucket          = data.aws_s3_bucket.security_logs.bucket_domain_name
    prefix          = "cf/${local.name_prefix}-static-um"
  }

  origin {
    origin_id   = "origin-bucket-${module.static_files.bucket.id}"
    domain_name = module.static_files.bucket.bucket_regional_domain_name

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.static_files_access_identity.cloudfront_access_identity_path
    }
  }

  default_root_object = "index.html"

  default_cache_behavior {
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    target_origin_id       = "origin-bucket-${module.static_files.bucket.id}"
    min_ttl                = "43200"  // 12 hours
    default_ttl            = "86400"  // 1 day
    max_ttl                = "604800" // 1 week
    viewer_protocol_policy = "redirect-to-https"
    compress               = true

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  viewer_certificate {
    acm_certificate_arn      = data.aws_acm_certificate.wildcard_atlas_stream_cert.arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021"
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "Core",
      service                  = "Cloudfront",
      plat_env_project_service = "${local.aggregated_tag}_CORE_CFR"
    }
  )
}

resource "aws_route53_record" "static_files_bucket_domain_record" {
  provider = aws.gdb-core-dev
  zone_id  = data.aws_route53_zone.atlas_stream_zone.id
  name     = module.domains[local.env_prefix]["atlas-um-static"]
  type     = "A"

  alias {
    name                   = aws_cloudfront_distribution.static_files_cdn.domain_name
    zone_id                = aws_cloudfront_distribution.static_files_cdn.hosted_zone_id
    evaluate_target_health = false
  }
}

resource "aws_cloudfront_origin_access_identity" "static_notifications_access_identity" {
  comment = "Cloudfront access identity for accessing bucket ${module.static_notifications.bucket.id}"
}

resource "aws_cloudfront_distribution" "static_notifications_cdn" {
  enabled      = true
  price_class  = "PriceClass_100"
  http_version = "http2"
  aliases      = [module.domains[local.env_prefix]["static-notifications"]]
  web_acl_id   = data.aws_wafv2_web_acl.ioc_web_acl_global.arn

  logging_config {
    include_cookies = false
    bucket          = data.aws_s3_bucket.security_logs.bucket_domain_name
    prefix          = "cf/${local.name_prefix}-static-notifications"
  }

  origin {
    origin_id   = "origin-bucket-${module.static_notifications.bucket.id}"
    domain_name = module.static_notifications.bucket.bucket_regional_domain_name

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.static_notifications_access_identity.cloudfront_access_identity_path
    }
  }

  default_root_object = "index.html"

  default_cache_behavior {
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    target_origin_id       = "origin-bucket-${module.static_notifications.bucket.id}"
    min_ttl                = "43200"  // 12 hours
    default_ttl            = "86400"  // 1 day
    max_ttl                = "604800" // 1 week
    viewer_protocol_policy = "redirect-to-https"
    compress               = true

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  viewer_certificate {
    acm_certificate_arn      = data.aws_acm_certificate.wildcard_atlas_stream_cert.arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021"
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "Core",
      service                  = "Cloudfront",
      plat_env_project_service = "${local.aggregated_tag}_CORE_CFR"
    }
  )
}

resource "aws_route53_record" "static_notifications_bucket_domain_record" {
  provider = aws.gdb-core-dev
  zone_id  = data.aws_route53_zone.atlas_stream_zone.zone_id
  name     = module.domains[local.env_prefix]["static-notifications"]
  type     = "A"

  alias {
    name                   = aws_cloudfront_distribution.static_notifications_cdn.domain_name
    zone_id                = aws_cloudfront_distribution.static_notifications_cdn.hosted_zone_id
    evaluate_target_health = false
  }
}
