# Lambda function for the acknowledge step
module "acknowledge_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-acknowledge"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-acknowledge-${var.environment}"
  lambda_description       = "Initiates the podcast asset validation and encoding flow"

  lambda_function_environment_variables = {
    Environment                  = var.environment
    SNS_GENERAL_STATUS_TOPIC_ARN = module.sns_general_status.proxied_sns_arn
    SENTRY_DSN                   = var.sentry_dsn_acknowledge
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  iam_policy_file_enabled                        = true
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for the encoding route step
module "encoding_route_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-encoding-route"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-encoding-route-${var.environment}"
  lambda_description       = "Determines the media type of the given podcast asset and branches to either the audio or image flow"

  lambda_function_environment_variables = {
    Environment                  = var.environment
    SNS_GENERAL_STATUS_TOPIC_ARN = module.sns_general_status.proxied_sns_arn
    SENTRY_DSN                   = var.sentry_dsn_encoding_route
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for the audio validation step
module "audio_validation_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-audio-validation"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-audio-validation-${var.environment}"
  lambda_description       = "Validates audio files"

  lambda_function_environment_variables = {
    Environment                  = var.environment
    SNS_GENERAL_STATUS_TOPIC_ARN = module.sns_general_status.proxied_sns_arn
    SENTRY_DSN                   = var.sentry_dsn_audio_validation
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_memory_size                    = var.audio_validation_lambda_memory_size
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for the image validation step
module "image_validation_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-image-validation"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-image-validation-${var.environment}"
  lambda_description       = "Validates images for podcasts"

  lambda_function_environment_variables = {
    Environment                  = var.environment
    SNS_GENERAL_STATUS_TOPIC_ARN = module.sns_general_status.proxied_sns_arn
    SENTRY_DSN                   = var.sentry_dsn_image_validation
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_memory_size                    = var.image_validation_lambda_memory_size
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for the image encoding step
module "image_encoding_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-image-encoding"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-image-encoding-${var.environment}"
  lambda_description       = "Encodes images"

  lambda_function_environment_variables = {
    Environment                   = var.environment
    SNS_ENCODING_STATUS_TOPIC_ARN = module.sns_encoding_status.proxied_sns_arn
    SNS_GENERAL_STATUS_TOPIC_ARN  = module.sns_general_status.proxied_sns_arn
    OUTPUT_BUCKET_NAME            = var.output_assets_bucket
    PREVIEW_OUTPUT_BUCKET_NAME    = var.image_previews_bucket
    SENTRY_DSN                    = var.sentry_dsn_image_encoding
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_memory_size                    = var.image_encoding_lambda_memory_size
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for general asset status notifications
module "general_status_notification_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-general-status-notification"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-general-status-notification-${var.environment}"
  lambda_description       = "Updates the status of an asset processing job"

  lambda_function_environment_variables = {
    Environment = var.environment
    SENTRY_DSN  = var.sentry_dsn_general_status
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for generation of waveform output file
module "audio_waveform_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-audio-waveform-generation"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-audio-waveform-generation-${var.environment}"
  lambda_description       = "Generates audio waveform using audiowaveform binary"

  lambda_function_environment_variables = {
    Environment                    = var.environment
    SNS_ENCODING_STATUS_TOPIC_ARN  = module.sns_encoding_status.proxied_sns_arn
    SNS_GENERAL_STATUS_TOPIC_ARN   = module.sns_general_status.proxied_sns_arn
    SENTRY_DSN                     = var.sentry_dsn_audio_waveform
    OUTPUT_BUCKET_NAME             = var.output_assets_bucket
    ELASTIC_TRANSCODER_PIPELINE_ID = var.elastic_transcoder_pipeline_id
  }

  lambda_function_timeout                        = var.audio_waveform_lambda_execution_time
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_memory_size                    = var.audio_waveform_lambda_memory_size
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for the final status notification lambda
module "final_status_notification_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-final-status-notification"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-final-status-notification-${var.environment}"
  lambda_description       = "Processes notifications for the final status of an asset"

  lambda_function_environment_variables = {
    Environment        = var.environment
    SENTRY_DSN         = var.sentry_dsn_final_status
    OUTPUT_BUCKET_NAME = var.output_assets_bucket
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_enabled                        = true
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# Lambda function for error reporting step
module "error_reporting_lambda" {
  source = "git@github.com:theorchard/terraform-lambda.git"

  environment              = var.environment
  lambda_name              = "podcast-assets-error-reporting"
  use_custom_function_name = true
  custom_function_name     = "podcast-assets-error-reporting-${var.environment}"
  lambda_description       = "Reports about lambda error caught by step function"

  lambda_function_environment_variables = {
    Environment                  = var.environment
    SNS_GENERAL_STATUS_TOPIC_ARN = module.sns_general_status.proxied_sns_arn
    SENTRY_DSN                   = var.sentry_dsn_error_reporting
  }

  lambda_function_timeout                        = var.lambda_default_timeout
  vpc_security_group_ids                         = var.vpc_security_group_ids
  iam_policy_file_enabled                        = true
  vpc_subnet_ids                                 = var.vpc_subnet_ids
  iam_policy_file_location                       = var.iam_policy_file_location
  lambda_function_reserved_concurrent_executions = var.lambda_concurrent_executions
  datadog_enabled                                = var.datadog_enabled
}

# SNS definition for the encoding status topic, including lambda subscription
module "sns_encoding_status" {
  source = "../proxy_sns_to_lambda"

  environment    = var.environment
  lambda_arn     = module.final_status_notification_lambda.lambda_arn
  lambda_name    = "podcast-assets-final-status-notification-${var.environment}"
  sns_topic_name = var.sns_encoding_status_topic_name
}

# SNS topic for general status notifications, including lambda subscription
module "sns_general_status" {
  source = "../proxy_sns_to_lambda"

  environment    = var.environment
  lambda_arn     = module.general_status_notification_lambda.lambda_arn
  lambda_name    = "podcast-assets-general-status-notification-${var.environment}"
  sns_topic_name = var.sns_general_topic_name
}

