data "aws_iam_policy_document" "ddb_streams_handler_policy_document" {
  statement {
    effect = "Allow"
    actions = [
      "lambda:InvokeFunction"
    ]
    resources = [
      module.lambda_save_to_dd_db.lambda_arn
    ]
  }

  statement {
    effect = "Allow"
    actions = [
      "dynamodb:BatchGetItem",
      "dynamodb:BatchWriteItem",
      "dynamodb:CreateTable",
      "dynamodb:DescribeLimits",
      "dynamodb:DescribeStream",
      "dynamodb:DescribeTable",
      "dynamodb:DeleteItem",
      "dynamodb:GetItem",
      "dynamodb:GetRecords",
      "dynamodb:GetShardIterator",
      "dynamodb:ListStreams",
      "dynamodb:PutItem",
      "dynamodb:Query",
      "dynamodb:Scan",
      "dynamodb:UpdateItem",
      "dynamodb:UpdateTable"
    ]
    resources = [
      module.ar_to_ddb_sync_dynamodb_table.aws_dynamodb_table_arn
    ]
  }

  statement {
    effect = "Allow"
    actions = [
      "dynamodb:ListTables"
    ]
    resources = [
      "*"
    ]
  }
}

resource "aws_iam_policy" "ddb_streams_handler_lambda_policy" {
  name        = "${var.environment}-ddb-streams-handler"
  description = "ddb-streams-handler lambda policy"
  policy      = data.aws_iam_policy_document.ddb_streams_handler_policy_document.json
}

module "lambda_ddb_streams_handler" {
  source = "git@github.com:theorchard/terraform-lambda.git//?ref=5.3.0"

  environment                                    = var.environment
  application_family                             = var.application_family
  use_container_image                            = true
  lambda_name                                    = "${var.service_name}-ddb-streams-handler"
  lambda_description                             = "DynamoDB streams handler"
  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_enabled                                    = true
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  vpc_id                                         = var.vpc_id
  lambda_function_memory_size                    = var.lambda_memory_size
  event_source_mapping_enabled                   = true
  event_source_mapping_batch_size                = 20
  event_source_mapping_parallelization_factor    = 1
  event_source_mapping_resource_type             = "dynamodb"
  event_source_mapping_stream_name               = var.vector_orders_dynamo_table_stream_name
  event_source_mapping_table_name                = module.ar_to_ddb_sync_dynamodb_table.aws_dynamodb_table_id
  event_source_mapping_starting_position         = "LATEST"
  lambda_function_reserved_concurrent_executions = -1

  iam_managed_policy_attachments = [
    aws_iam_policy.ddb_streams_handler_lambda_policy.arn
  ]

  lambda_function_environment_variables = {
    Environment               = var.environment
    SENTRY_DSN                = module.sentry_ddb_streams_handler_lambda.sentry_key_dsn_public_output
    DD_API_KEY_SECRET_ARN     = data.aws_secretsmanager_secret.datadog_api.arn
    ORDERS_DDB_TABLE          = module.ar_to_ddb_sync_dynamodb_table.aws_dynamodb_table_id
    ORDERS_S3_BUCKET          = data.aws_s3_bucket.orcd_bucket.id
    VO_TO_DD_SYNC_LAMBDA_NAME = module.lambda_save_to_dd_db.lambda_name
  }
}
