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

# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket         = "orcd-terraform-state"
    key            = "qa/lambda-assets/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = "true"
    # dynamodb_table = "terraform-qa-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                      = "${var.environment}-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://6be22fbcf8c74eb99ab153a82e061942:2b0eb9f7068b4546af5e94dd59a7b7dd@sentry.io/1254321"
#   sentry_dsn_encoding_route   = "https://09bd0c15e361478e9e09da0d71288009:f40cd3a404b846a7a73bbacd4cb701ea@sentry.io/1254322"
#   sentry_dsn_image_validation = "https://7f8dec2c61d6409baa7cfe2875deecc5:884b82cf3fda42a59b6fa9577299940f@sentry.io/1254323"
#   sentry_dsn_image_encoding   = "https://38557538c4b24abd97d5a2a85b4ff9bd:52940b1aa6194fc986f8f9740ca8e464@sentry.io/1254324"
#   sentry_dsn_audio_validation = "https://3f04b1f3bf084744a34ad6e1e913fc6a:cf9619e9d6334fd7b224ea23c24cf0a9@sentry.io/1254325"
#   sentry_dsn_general_status   = "https://b7c1809b20304499b6f625f6951897af:161571469ba947268ecc011532ab051e@sentry.io/1254326"
#   sentry_dsn_final_status     = "https://354a02b6ed3a489da749c9e6d4e74841:788a2e0056264461adb6b64c9248aa11@sentry.io/1254328"
#   sentry_dsn_error_reporting  = "https://89c6e333f05b4c559e775e8bfbdad846:8e9cafdb65c740ae93ffbed84dad5a97@sentry.io/1267643"
# }

# 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}"
# }

module audio_transcoder {
  source = "../modules/audio_elastictranscoder"

  environment             = "${var.environment}"
  raw_assets_bucket       = "${module.buckets.raw_assets_bucket_name}"
  mezzanine_assets_bucket = "${module.buckets.mezzanine_assets_bucket_name}"
}
