provider "aws" {
  region = "${var.region}"
}

# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket         = "orcd-terraform-state"
    key            = "prod/lambda-assets/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = "true"
    dynamodb_table = "terraform-prod-lambda-assets"
  }
}

# Current account identity.
data "aws_caller_identity" "current" {}

module "buckets" {
  source                 = "../modules/buckets"
  environment            = "${var.environment}"
  raw_assets_bucket_cors = "${var.raw_assets_bucket_cors}"
}

# CloudFront distribution. This is declared in main.tf instead of the buckets module 
# because we had to import the existing resource. We dont want to recreate the distribution,
# we only need to update its behaviors.
locals {
  s3_origin_id                            = "S3-${module.buckets.image_previews_bucket_name}/images"
  distribution_domain                     = "${module.buckets.image_previews_bucket_name}.s3.amazonaws.com"
  distribution_alias                      = "images.theorchard.io"
  images_distribution_acm_certificate_arn = "arn:aws:acm:us-east-1:437795906767:certificate/a76e4883-28aa-4062-a4cc-c06b8012ae28"
  images_distribution_domain              = "theorchard.io"
}

resource "aws_cloudfront_origin_access_identity" "origin_access_identity" {
  comment = "access-identity-${local.distribution_domain}"
}

resource "aws_cloudfront_distribution" "images_distribution" {
  enabled         = true
  is_ipv6_enabled = true
  comment         = "Distribution for thumbnail images ${local.distribution_alias}"
  aliases         = ["${local.distribution_alias}"]
  price_class     = "PriceClass_All"
  http_version    = "http2"

  origin {
    domain_name = "${local.distribution_domain}"
    origin_path = "/images"
    origin_id   = "${local.s3_origin_id}"

    s3_origin_config {
      origin_access_identity = "${aws_cloudfront_origin_access_identity.origin_access_identity.cloudfront_access_identity_path}"
    }
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
      locations        = []
    }
  }

  default_cache_behavior {
    allowed_methods        = ["HEAD", "GET"]
    cached_methods         = ["HEAD", "GET"]
    target_origin_id       = "${local.s3_origin_id}"
    min_ttl                = 0
    max_ttl                = 31536000
    default_ttl            = 86400
    viewer_protocol_policy = "https-only"
    compress               = false
    smooth_streaming       = false

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }
  }

  ordered_cache_behavior {
    path_pattern           = "product/*"
    allowed_methods        = ["HEAD", "GET"]
    cached_methods         = ["HEAD", "GET"]
    target_origin_id       = "${local.s3_origin_id}"
    min_ttl                = 0
    max_ttl                = 25
    default_ttl            = 25
    viewer_protocol_policy = "https-only"
    compress               = false
    smooth_streaming       = false

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }
  }

  ordered_cache_behavior {
    path_pattern           = "v2/product/*"
    allowed_methods        = ["HEAD", "GET"]
    cached_methods         = ["HEAD", "GET"]
    target_origin_id       = "${local.s3_origin_id}"
    min_ttl                = 86400
    max_ttl                = 31536000
    default_ttl            = 86400
    viewer_protocol_policy = "https-only"
    compress               = false
    smooth_streaming       = false

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }
  }

  custom_error_response {
    error_code            = 403
    error_caching_min_ttl = 300
    response_code         = 403
    response_page_path    = "/404"
  }

  custom_error_response {
    error_code            = 404
    error_caching_min_ttl = 300
    response_code         = 404
    response_page_path    = "/404"
  }

  viewer_certificate {
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2018"
    acm_certificate_arn      = "${local.images_distribution_acm_certificate_arn}"
  }

  lifecycle {
    ignore_changes = all
  }
}

# module "lambdas" {
#   source = "../modules/lambdas"

#   environment                       = "${var.environment}"
#   sns_general_topic_name            = "${var.sns_general_topic_name}"
#   sns_encoding_status_topic_name    = "${var.sns_encoding_status_topic_name}"
#   vpc_security_group_ids            = "${var.vpc_security_group_ids}"
#   vpc_subnet_ids                    = "${var.vpc_subnet_ids}"
#   vpc_subnet_ids_v2                 = "${var.vpc_subnet_ids_v2}"
#   mezzanine_assets_bucket           = "${module.buckets.mezzanine_assets_bucket_name}"
#   image_previews_bucket             = "${module.buckets.image_previews_bucket_name}"
#   image_encoding_lambda_memory_size = "${var.image_encoding_lambda_memory_size}"

#   sentry_dsn_acknowledge      = "https://4318163b63ee4400a54c7fa96549846e:83a2e4b913b14054a49b0fb2dcc2085b@sentry.io/1254329"
#   sentry_dsn_encoding_route   = "https://8b314d4cbf774f4ca0e644c1ba4a51c6:b6b41373ff3f4677b49483dc02ef79de@sentry.io/1254331"
#   sentry_dsn_image_validation = "https://8c4626c9d76244ae93e15b8a5646c01d:0bf83b0cf59d41a5bcf5895dd6d6fd55@sentry.io/1254333"
#   sentry_dsn_image_encoding   = "https://36dd1e14239e4d4194d688d536e719ab:bbd000fc3d0342a6b21bee719d15395c@sentry.io/1254334"
#   sentry_dsn_audio_validation = "https://0ae9b7e2fdbd42e8a939faf1ea0a2c4e:e6deb19084604de38b7656ee39f131ec@sentry.io/1254335"
#   sentry_dsn_general_status   = "https://3ba862d06c7542a4a8e036c2a0a3f238:7da533a4e41d47e28a8f4c3aa207186e@sentry.io/1254336"
#   sentry_dsn_final_status     = "https://94f8e3f1d6294d44992576fa62d6a04e:ff0a72b1b08944c28ce9447bdc90e9cc@sentry.io/1254338"
#   sentry_dsn_error_reporting  = "https://c338d08899464ee88081911837fdda3c:d5334cecf9a644b3b6ab0759d939dfd9@sentry.io/1267644"
# }

# module "state_machine" {
#   source = "../modules/transcoding_state_machine"

#   environment                    = "${var.environment}"
#   region                         = "${var.region}"
#   acknowledge_lambda_v2_arn      = "${module.lambdas.acknowledge_lambda_v2_arn}"
#   encoding_route_lambda_v2_arn   = "${module.lambdas.encoding_route_lambda_v2_arn}"
#   audio_validation_lambda_v2_arn = "${module.lambdas.audio_validation_lambda_v2_arn}"
#   image_validation_lambda_v2_arn = "${module.lambdas.image_validation_lambda_v2_arn}"
#   image_encoding_lambda_v2_arn   = "${module.lambdas.image_encoding_lambda_v2_arn}"
#   error_reporting_lambda_v2_arn  = "${module.lambdas.error_reporting_lambda_v2_arn}"
#   raw_assets_bucket              = "${module.buckets.raw_assets_bucket_name}"
# }
