# General variables
provider "aws" {
  region = "us-east-1"

  default_tags {
    tags = module.default_tags.tags
  }
}

module "default_tags" {
  source             = "git@github.com:theorchard/terraform-default-tags.git//?ref=2.0.0"
  environment        = var.environment
  application_family = var.application_family
  service_name       = var.service_name
  team_name          = var.team_name
}

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

provider "kafka" {
  bootstrap_servers = var.kafka_bootstrap_servers
  tls_enabled       = true
}

# Test (qa/prod) lambda function
module "test_dev_basic_lambda" {
  source = "../"

  environment        = var.environment
  lambda_name        = var.service_name
  lambda_description = "Does things that a lambda would do."
  application_family = "platform"
  # These are optional
  additional_tags = {
    "user_supplied_tag_1" = "some_project",
    "user_supplied_tag_2" = "orchard"
  }
  lambda_function_reserved_concurrent_executions = "3"
  lambda_function_timeout                        = "30"
  lambda_function_package_path                   = var.lambda_zip_location
  lambda_assume_role_service_identifiers = [
    "lambda.amazonaws.com",
    "events.amazonaws.com",
    "states.amazonaws.com",
    "s3.amazonaws.com"
  ]

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids
}

# Test lambda with creating security group
module "test_dev_basic_lambda_create_sg" {
  source = "../"

  environment        = var.environment
  lambda_name        = "${var.service_name}-with-sg"
  lambda_description = "Does things that a lambda would do."
  application_family = "platform"
  # These are optional
  additional_tags = {
    "user_supplied_tag_1" = "some_project",
    "user_supplied_tag_2" = "orchard"
  }
  lambda_function_reserved_concurrent_executions = "3"
  lambda_function_timeout                        = "30"
  lambda_function_package_path                   = var.lambda_zip_location
  lambda_assume_role_service_identifiers = [
    "lambda.amazonaws.com",
    "events.amazonaws.com",
    "states.amazonaws.com",
    "s3.amazonaws.com"
  ]

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id                    = var.vpc_id
  vpc_subnet_ids            = var.vpc_subnet_ids
  vpc_create_security_group = true
}

module "test_dev_lambda" {
  source = "../"

  environment                                    = var.environment
  lambda_name                                    = "${var.service_name}-with-sns"
  application_family                             = "platform"
  lambda_description                             = "Does things that a lambda would do."
  lambda_function_reserved_concurrent_executions = "3"
  lambda_function_timeout                        = "30"
  lambda_function_package_path                   = var.lambda_zip_location
  sqs_event_enabled                              = true
  event_source_mapping_batch_size                = "1"
  event_source_mapping_resource_type             = "sqs"
  event_source_mapping_queue_name                = "${var.environment}-test_lambda_trigger"

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids

  datadog_enabled = false
}

module "test_dev_lambda_with_sqs_response_types" {
  source = "../"

  environment                                    = var.environment
  lambda_name                                    = "${var.service_name}-with-sqs-response-types"
  application_family                             = "platform"
  lambda_description                             = "Does things that a lambda would do."
  lambda_function_reserved_concurrent_executions = "3"
  lambda_function_timeout                        = "30"
  lambda_function_package_path                   = var.lambda_zip_location
  sqs_event_enabled                              = true
  event_source_mapping_batch_size                = "100"
  event_source_mapping_batch_window              = "10"
  event_source_mapping_response_types            = ["ReportBatchItemFailures"]
  event_source_mapping_resource_type             = "sqs"
  event_source_mapping_queue_name                = "${var.environment}-test_lambda_trigger"

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids

  datadog_enabled = false
}

module "test_dev_lambda_with_sqs_dlq" {
  source = "../"

  environment                                    = var.environment
  lambda_name                                    = "${var.service_name}-with-sqs"
  application_family                             = "platform"
  lambda_description                             = "Does things that a lambda would do."
  lambda_function_reserved_concurrent_executions = "3"
  lambda_function_timeout                        = "30"
  lambda_function_package_path                   = var.lambda_zip_location
  dlq_type                                       = "sqs"

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids

  datadog_enabled = false
}

module "test_dev_lambda_with_msk" {
  source = "../"

  environment                                    = var.environment
  lambda_name                                    = "${var.service_name}-with-msk"
  application_family                             = "platform"
  lambda_description                             = "Does things that a lambda would do."
  lambda_function_reserved_concurrent_executions = "3"
  lambda_function_timeout                        = "30"
  lambda_function_package_path                   = var.lambda_zip_location
  msk_event_enabled                              = true
  kafka_topics                                   = ["test-topic"]
  event_source_mapping_msk_cluster_name          = "${var.environment}-managed-kafka-cdc-destination"
  event_source_mapping_msk_cluster_uuid          = "194e93a4-1a4e-4e96-85bd-99b4ebce8df0-11"

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids

  datadog_enabled = false
}


module "test_dev_provisioned_lambda_with_msk" {
  source = "../"

  environment                                       = var.environment
  lambda_name                                       = "${var.service_name}-provisioned-with-msk"
  application_family                                = "platform"
  lambda_description                                = "A lambda with provisioned concurrency that processes MSK events."
  lambda_function_provisioned_concurrent_executions = "2"
  lambda_function_timeout                           = "30"
  lambda_function_package_path                      = var.lambda_zip_location
  msk_event_enabled                                 = true
  kafka_topics                                      = ["test-topic"]
  event_source_mapping_msk_cluster_name             = "${var.environment}-managed-kafka-cdc-destination"
  event_source_mapping_msk_cluster_uuid             = "194e93a4-1a4e-4e96-85bd-99b4ebce8df0-11"

  lambda_function_environment_variables = {
    Environment = var.environment
  }

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids

  datadog_enabled = false
}

module "lambda_without_vpc" {
  source = "../"

  environment                  = var.environment
  lambda_name                  = "${var.service_name}-without-vpc"
  application_family           = "platform"
  lambda_description           = "Tests Lambda function that is not VPC-bound."
  lambda_function_package_path = var.lambda_zip_location

  vpc_enabled               = false
  vpc_create_security_group = false
}
