provider "aws" {
  region = "us-east-1"
}

terraform {
  backend "s3" {
    bucket  = "orcd-terraform-state"
    key     = "prod/lambda-collaborator/report-process/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

data "aws_caller_identity" "current" {}

data "aws_s3_bucket" "query_results_bucket" {
  bucket = var.query_results_bucket_name
}

data "aws_s3_bucket" "output_bucket" {
  bucket = var.output_bucket_name
}

data "aws_ses_email_identity" "notification_from_email_identity" {
  email = var.notification_from_email
}

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

  application_family  = var.application_family
  use_container_image = true
  environment         = var.environment
  lambda_name         = var.lambda_name
  vpc_id              = "vpc-7f0e841a"
  vpc_subnet_ids      = ["subnet-cb4dbae0", "subnet-5366ef24"]

  lambda_description                     = "Processes Snowflake query results for Collaborators report generation"
  lambda_function_handler                = "index.handler"
  lambda_function_timeout                = 900
  lambda_function_ephemeral_storage_size = 10240
  lambda_function_memory_size            = 8192

  lambda_function_environment_variables = {
    Environment             = var.environment
    LOGGER_DSN              = "https://${var.environment}-fluentd-applications.theorchard.io:8888/application"
    COLLAB_DB_USER          = "collab_env"
    COLLAB_DB_DATABASE      = "ows_collaborator"
    COLLAB_DB_HOST          = var.collab_db_host
    DD_ENV                  = var.environment
    DD_SERVICE              = var.lambda_name
    OUTPUT_BUCKET           = var.output_bucket_name
    NOTIFICATION_FROM_EMAIL = var.notification_from_email
    AWS_ACCOUNT_ID          = data.aws_caller_identity.current.account_id
  }

  datadog_advanced_enabled                 = true
  datadog_function_destination_lambda_name = "DatadogLambdaFunction"

  s3_event_enabled     = true
  s3_event_bucket_name = data.aws_s3_bucket.query_results_bucket.id
}

resource "aws_s3_bucket_notification" "query_results_bucket_notification" {
  bucket = data.aws_s3_bucket.query_results_bucket.id

  lambda_function {
    lambda_function_arn = module.collaborator_report_process.lambda_arn
    events              = ["s3:ObjectCreated:*"]
  }
}

resource "aws_iam_role_policy" "lambda_execution_iam_policy" {
  role   = module.collaborator_report_process.lambda_role_id
  policy = data.aws_iam_policy_document.lambda_execution_iam_policy_document.json
}

data "aws_iam_policy_document" "lambda_execution_iam_policy_document" {
  statement {
    actions = [
      "s3:PutObject",
    ]

    resources = ["${data.aws_s3_bucket.output_bucket.arn}/*"]
  }

  statement {
    actions = [
      "ses:SendEmail",
    ]

    resources = [data.aws_ses_email_identity.notification_from_email_identity.arn]
  }
}

module "secrets" {
  source   = "git@github.com:theorchard/terraform-secrets-manager.git//?ref=1.5.1"
  for_each = toset(var.secrets_manager_secret_names)

  environment        = var.environment
  service_name       = var.lambda_name
  secret_name        = each.value
  application_family = var.application_family
}

module "sentry_project" {
  source             = "git@github.com:theorchard/terraform-sentry//?ref=4.0.2"
  service_name       = var.lambda_name
  environment        = var.environment
  platform           = "python"
  application_family = var.application_family
}
