locals {
  lambda_kinesis_stream_dir = "lambda/kinesis-stream"
  lambda_kinesis_stream_hash = md5(join(",", [
    filemd5("${local.lambda_kinesis_stream_dir}/index.py"),
    filemd5("${local.lambda_kinesis_stream_dir}/requirements.txt"),
    filemd5("${local.lambda_kinesis_stream_dir}/Dockerfile")
  ]))
}

resource "aws_ecr_repository" "lambda_kinesis_stream_repository" {
  name                 = "${var.service_name}-kinesis-stream"
  image_tag_mutability = "MUTABLE"

  encryption_configuration {
    encryption_type = "KMS"
  }

  image_scanning_configuration {
    scan_on_push = true
  }

  force_delete = true
}

resource "null_resource" "lambda_kinesis_stream_build" {
  triggers = {
    src_hash = local.lambda_kinesis_stream_hash
  }

  provisioner "local-exec" {
    command = "/bin/bash ./lambda/build-docker.sh"

    environment = {
      SRC_DIR             = local.lambda_kinesis_stream_dir
      ECR_REPOSITORY_NAME = aws_ecr_repository.lambda_kinesis_stream_repository.name
      ECR_REPOSITORY_TAG  = local.lambda_kinesis_stream_hash
      ECR_REPOSITORY_URL  = aws_ecr_repository.lambda_kinesis_stream_repository.repository_url
    }
  }
}

module "lambda_kinesis_stream" {
  source = "../"

  environment        = var.environment
  lambda_name        = "${var.service_name}-kinesis-stream"
  lambda_description = "Tests DataDog integration with Kinesis Stream."
  application_family = "platform"

  use_container_image        = true
  container_image_custom_uri = "${aws_ecr_repository.lambda_kinesis_stream_repository.repository_url}:${local.lambda_kinesis_stream_hash}"

  vpc_id                = var.vpc_id
  vpc_subnet_ids        = var.vpc_subnet_ids
  vpc_enable_eni_lookup = false

  datadog_enabled          = true
  datadog_advanced_enabled = true

  event_source_mapping_enabled                     = true
  event_source_mapping_batch_size                  = 1
  event_source_mapping_resource_type               = "kinesis"
  event_source_mapping_stream_name                 = aws_kinesis_stream.lambda_kinesis_stream.name
  event_source_mapping_starting_position           = "AT_TIMESTAMP"
  event_source_mapping_starting_position_timestamp = time_static.lambda_kinesis_stream_creation_time.rfc3339
  event_source_mapping_filter_criteria_pattern     = jsonencode({ "FileName" = [{ "suffix" = ".png" }] })

  lambda_function_environment_variables = {
    BUILD_ID = null_resource.lambda_kinesis_stream_build.id
  }

  depends_on = [
    aws_ecr_repository.lambda_kinesis_stream_repository
  ]
}

resource "time_static" "lambda_kinesis_stream_creation_time" {
  triggers = {
    stream_name = aws_kinesis_stream.lambda_kinesis_stream.name
  }
}

resource "aws_kinesis_stream" "lambda_kinesis_stream" {
  name             = "${var.environment}-${var.service_name}-kinesis-stream"
  shard_count      = 1
  retention_period = 24

  encryption_type = "KMS"
  kms_key_id      = "alias/aws/kinesis"

  stream_mode_details {
    stream_mode = "PROVISIONED"
  }

  tags = {
    environment  = var.environment
    service_name = var.service_name
  }
}
