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
}

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = module.default_tags.tags
  }
}

provider "aws" {
  region  = var.aws_region
  alias   = "networking"
  profile = "networking"

  default_tags {
    tags = module.default_tags.tags
  }
}

terraform {
  backend "s3" {
    bucket  = "orcd-terraform-state"
    key     = "qa/neighbouring-rights/delivery/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

module "vpc_info" {
  source = "git@github.com:theorchard/terraform-vpc-info.git//?ref=3.0.4"

  environment = var.environment
}

data "aws_acm_certificate" "theorchard_io" {
  domain   = "*.theorchard.io"
  statuses = ["ISSUED"]
}

data "aws_route53_zone" "route53_zone" {
  name = "theorchard.io"
}

data "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.environment}-neighbouring-rights"
}

data "aws_iam_policy" "delivery_bucket_rw_policy" {
  name = "S3-${var.environment}-neighbouring-rights-delivery-RW"
}

data "aws_iam_policy" "contributions_bucket_read_policy" {
  name = "S3-${var.environment}-neighbouring-rights-contributions-R"
}

data "aws_iam_policy" "cmo_templates_bucket_read_policy" {
  name = "S3-${var.environment}-neighbouring-rights-cmo-templates-R"
}

// For create_jobs lambda.
module "lambda_nr_claim_create_jobs" {
  source                                         = "git@github.com:theorchard/terraform-lambda.git//?ref=4.3.0"
  environment                                    = var.environment
  lambda_name                                    = var.create_jobs_lambda_name
  lambda_description                             = "Creates jobs for a delivery order."
  lambda_function_timeout                        = "300"
  use_container_image                            = true
  vpc_subnet_ids                                 = module.vpc_info.default_private_subnet_ids
  vpc_enabled                                    = true
  vpc_id                                         = module.vpc_info.vpc_id
  datadog_advanced_enabled                       = true
  application_family                             = var.application_family
  lambda_function_reserved_concurrent_executions = 30
  splitio_enabled                                = true
  lambda_function_memory_size                    = 1024

  lambda_function_environment_variables = {
    Environment        = var.environment
    SENTRY_DSN         = module.lambda_nr_claim_create_jobs_sentry_project.sentry_key_dsn_public_output
    BUCKET_NAME        = data.aws_s3_bucket.s3_bucket.bucket
    GRAPHQL_URL        = var.graphql_router_url
    SPLIT_API_KEY_PATH = "${var.environment}/split/API_KEY"
  }

  iam_managed_policy_attachments = [
    data.aws_iam_policy.delivery_bucket_rw_policy.arn
  ]
}

module "lambda_nr_claim_create_jobs_sentry_project" {
  source             = "git@github.com:theorchard/terraform-sentry.git//?ref=4.1.2"
  service_name       = var.create_jobs_lambda_name
  environment        = var.environment
  platform           = "node"
  application_family = var.application_family
}

module "lambda_nr_claim_create_jobs_datadog_monitors" {
  source                 = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"
  service_name           = var.create_jobs_lambda_name
  environment            = var.environment
  notification_endpoints = var.slack_alert_channel
  teams                  = [var.team_name]
}

// For Job Finalizer lambda.
module "lambda_nr_claim_job_finalizer" {
  source                                         = "git@github.com:theorchard/terraform-lambda.git//?ref=4.3.0"
  environment                                    = var.environment
  lambda_name                                    = var.job_finalizer_lambda_name
  lambda_description                             = "Finalizes a delivery job."
  lambda_function_timeout                        = "900"
  use_container_image                            = true
  vpc_subnet_ids                                 = module.vpc_info.default_private_subnet_ids
  vpc_enabled                                    = true
  vpc_id                                         = module.vpc_info.vpc_id
  datadog_advanced_enabled                       = true
  application_family                             = var.application_family
  lambda_function_reserved_concurrent_executions = 30
  lambda_function_memory_size                    = 8192
  splitio_enabled                                = true

  lambda_function_environment_variables = {
    Environment        = var.environment
    SENTRY_DSN         = module.lambda_nr_claim_job_finalizer_sentry_project.sentry_key_dsn_public_output
    GRAPHQL_URL        = var.graphql_router_url
    SPLIT_API_KEY_PATH = "${var.environment}/split/API_KEY"
  }
  iam_managed_policy_attachments = [
    data.aws_iam_policy.delivery_bucket_rw_policy.arn
  ]

}

module "lambda_nr_claim_job_finalizer_sentry_project" {
  source             = "git@github.com:theorchard/terraform-sentry.git//?ref=4.1.2"
  service_name       = var.job_finalizer_lambda_name
  environment        = var.environment
  platform           = "node"
  application_family = var.application_family
}

module "lambda_nr_claim_job_finalizer_datadog_monitors" {
  source                 = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"
  service_name           = var.job_finalizer_lambda_name
  environment            = var.environment
  notification_endpoints = var.slack_alert_channel
  teams                  = [var.team_name]
}

// For order-finalizer lambda.
module "lambda_nr_claim_finalizer" {
  source                                         = "git@github.com:theorchard/terraform-lambda.git//?ref=4.3.0"
  environment                                    = var.environment
  lambda_name                                    = var.order_finalizer_lambda_name
  lambda_description                             = "Finalizes a delivery order."
  lambda_function_timeout                        = "900"
  use_container_image                            = true
  vpc_subnet_ids                                 = module.vpc_info.default_private_subnet_ids
  vpc_enabled                                    = true
  vpc_id                                         = module.vpc_info.vpc_id
  datadog_advanced_enabled                       = true
  application_family                             = var.application_family
  lambda_function_reserved_concurrent_executions = 30
  lambda_function_memory_size                    = 5120
  splitio_enabled                                = true

  lambda_function_environment_variables = {
    Environment        = var.environment
    SENTRY_DSN         = module.lambda_nr_claim_finalizer_sentry_project.sentry_key_dsn_public_output
    GRAPHQL_URL        = var.graphql_router_url
    SPLIT_API_KEY_PATH = "${var.environment}/split/API_KEY"
  }

  iam_managed_policy_attachments = [
    data.aws_iam_policy.delivery_bucket_rw_policy.arn,
  ]
}

module "lambda_nr_claim_finalizer_sentry_project" {
  source             = "git@github.com:theorchard/terraform-sentry.git//?ref=4.1.2"
  service_name       = var.order_finalizer_lambda_name
  environment        = var.environment
  platform           = "node"
  application_family = var.application_family
}

module "lambda_nr_claim_finalizer_datadog_monitors" {
  source                 = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"
  service_name           = var.order_finalizer_lambda_name
  environment            = var.environment
  notification_endpoints = var.slack_alert_channel
  teams                  = [var.team_name]
}

// For delivery-queue-manager lambda.
module "lambda_nr_claim_delivery_queue_manager" {
  source                                         = "git@github.com:theorchard/terraform-lambda.git//?ref=4.3.0"
  environment                                    = var.environment
  lambda_name                                    = var.delivery_queue_manager_lambda_name
  lambda_description                             = "Manage delivery queue."
  lambda_function_timeout                        = "300"
  use_container_image                            = true
  vpc_subnet_ids                                 = module.vpc_info.default_private_subnet_ids
  vpc_enabled                                    = true
  vpc_id                                         = module.vpc_info.vpc_id
  datadog_advanced_enabled                       = true
  application_family                             = var.application_family
  lambda_function_reserved_concurrent_executions = 30

  lambda_function_environment_variables = {
    Environment = var.environment
    SENTRY_DSN  = module.lambda_nr_claim_delivery_queue_manager_sentry_project.sentry_key_dsn_public_output
    BUCKET_NAME = data.aws_s3_bucket.s3_bucket.bucket
    GRAPHQL_URL = var.graphql_router_url
  }
  iam_managed_policy_attachments = [
    data.aws_iam_policy.contributions_bucket_read_policy.arn
  ]

  msk_event_enabled                      = true
  event_source_mapping_msk_cluster_name  = var.trigger_msk_cluster_name
  event_source_mapping_msk_cluster_uuid  = var.trigger_msk_cluster_uuid
  event_source_mapping_batch_size        = 1
  kafka_topics = [var.contribution_version_topic]
  event_source_mapping_starting_position = "LATEST"
}

module "lambda_nr_claim_delivery_queue_manager_sentry_project" {
  source             = "git@github.com:theorchard/terraform-sentry.git//?ref=4.1.2"
  service_name       = var.delivery_queue_manager_lambda_name
  environment        = var.environment
  platform           = "node"
  application_family = var.application_family
}

module "lambda_nr_claim_delivery_queue_manager_datadog_monitors" {
  source                 = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"
  service_name           = var.delivery_queue_manager_lambda_name
  environment            = var.environment
  notification_endpoints = var.slack_alert_channel
  teams                  = [var.team_name]
}

// For delivery-coordinator lambda.
module "lambda_nr_claim_delivery_coordinator" {
  source                                         = "git@github.com:theorchard/terraform-lambda.git//?ref=4.3.0"
  environment                                    = var.environment
  lambda_name                                    = var.delivery_coordinator_lambda_name
  lambda_description                             = "Determines when delivery orders are executed."
  lambda_function_timeout                        = 300
  lambda_function_memory_size                    = 128
  use_container_image                            = true
  vpc_subnet_ids                                 = module.vpc_info.default_private_subnet_ids
  vpc_enabled                                    = true
  vpc_id                                         = module.vpc_info.vpc_id
  splitio_enabled                                = true
  datadog_advanced_enabled                       = true
  application_family                             = var.application_family
  lambda_function_reserved_concurrent_executions = 1

  msk_event_enabled                      = true
  event_source_mapping_msk_cluster_name  = var.trigger_msk_cluster_name
  event_source_mapping_msk_cluster_uuid  = var.trigger_msk_cluster_uuid
  event_source_mapping_batch_size        = 1
  kafka_topics = [var.delivery_order_status_topic]
  event_source_mapping_starting_position = "LATEST"

  lambda_function_environment_variables = {
    # common
    Environment             = var.environment
    SENTRY_DSN              = module.lambda_nr_claim_delivery_coordinator_sentry_project.sentry_key_dsn_public_output
    GRAPHQL_URL             = var.graphql_router_url
    SPLIT_API_KEY_PATH      = "${var.environment}/split/API_KEY"
    CMO_CLAIMING_STEPFN_ARN = aws_sfn_state_machine.claiming_state_machine.arn
  }

  iam_managed_policy_attachments = [
    aws_iam_policy.invoke_claiming_state_machine_policy.arn,
  ]
}

module "lambda_nr_claim_delivery_coordinator_sentry_project" {
  source             = "git@github.com:theorchard/terraform-sentry.git//?ref=4.1.2"
  service_name       = var.delivery_coordinator_lambda_name
  environment        = var.environment
  platform           = "node"
  application_family = var.application_family
}

module "lambda_nr_claim_delivery_coordinator_datadog_monitors" {
  source                 = "git@github.com:theorchard/terraform-datadog.git//modules/lambda?ref=6.13.9"
  service_name           = var.delivery_coordinator_lambda_name
  environment            = var.environment
  notification_endpoints = var.slack_alert_channel
  teams                  = [var.team_name]
}
