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

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

data "aws_caller_identity" "current" {}

module "report_trigger_queue" {
  source = "git@github.com:theorchard/terraform-sqs//?ref=2.4.1"

  environment                    = var.environment
  queue_name                     = var.queue_name
  application_family             = var.application_family
  sqs_message_retention_seconds  = 36000
  sqs_visibility_timeout_seconds = 960

  sqs_deadletter_enabled = "true"

  deadletter_message_retention_seconds = 1209600
  deadletter_max_receive_count         = 5
  deadletter_delay_seconds             = 10
  deadletter_max_message_size          = 2048
  deadletter_receive_wait_time_seconds = 10
}

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

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

  application_family  = var.application_family
  use_container_image = true
  environment         = var.environment
  lambda_name         = var.lambda_name
  vpc_id              = module.vpc_info.vpc_id
  vpc_subnet_ids      = module.vpc_info.default_private_subnet_ids

  lambda_description      = "Triggers asynchronous Snowflake query for Collaborators report generation"
  lambda_function_handler = "index.handler"
  lambda_function_timeout = 900

  event_source_mapping_queue_name = module.report_trigger_queue.queue_name
  event_source_mapping_batch_size = 1
  sqs_event_enabled               = true

  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
    SNOWFLAKE_ACCOUNT                      = "delphi.us-east-1"
    SNOWFLAKE_DATABASE                     = "FACTS"
    SNOWFLAKE_SCHEMA                       = upper(var.environment)
    SNOWFLAKE_USER                         = var.snowflake_user_role_warehouse
    SNOWFLAKE_ROLE                         = var.snowflake_user_role_warehouse
    SNOWFLAKE_WAREHOUSE                    = var.snowflake_user_role_warehouse
    SNOWFLAKE_S3_STAGE                     = var.snowflake_s3_stage
    SNOWFLAKE_DIM_TRACK                    = var.snowflake_dim_track
    SNOWFLAKE_DIM_TRANSACTIONTYPE          = var.snowflake_dim_transactiontype
    SNOWFLAKE_DIM_TRACK_ARTISTS_AGGREGATED = var.snowflake_dim_track_artists_aggregated
    SNOWFLAKE_DIM_COUNTRY                  = var.snowflake_dim_country
    SNOWFLAKE_DIM_STORE                    = var.snowflake_dim_store
    SNOWFLAKE_DIM_LABEL                    = var.snowflake_dim_label
    SNOWFLAKE_DIM_RELEASE                  = var.snowflake_dim_release
    SNOWFLAKE_DIM_ARTIST                   = var.snowflake_dim_artist
    SNOWFLAKE_UNIFIED_FACT_SALES           = var.snowflake_unified_fact_sales
    SNOWFLAKE_ABACUS_STATEMENT_PERIOD      = var.snowflake_abacus_statement_period
    DD_ENV                                 = var.environment
    DD_SERVICE                             = var.lambda_name
  }

  datadog_advanced_enabled                 = true
  datadog_function_destination_lambda_name = "DatadogLambdaFunction"
}

resource "aws_iam_role_policy" "lambda_execution_iam_policy" {
  role   = module.collaborator_report_trigger.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 = [
      "secretsmanager:GetSecretValue",
    ]

    resources = [for secret in module.secrets : secret.secret_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
}
