locals {
  playlists_messages_secrets = [
    "SENTRY_DSN",
  ]

  playlists_messages_env_vars = {
    ENVIRONMENT = local.environment
    SENTRY_DSN  = aws_secretsmanager_secret.playlists_messages_secret["SENTRY_DSN"].name

    USERDATAAPI_APIKEY = aws_secretsmanager_secret.apollo_user_data_secret["AUTH_API_KEY"].name
    USERDATAAPI_HOST   = module.domains[local.env_prefix]["user-data-api"]
    USERDATAAPI_SCHEMA = "https"

    GATEAPI_APIKEY = aws_secretsmanager_secret.apollo_gate_api_secret["AUTH_API_KEY"].name
    GATEAPI_HOST   = module.domains[local.env_prefix]["gate-api"]
    GATEAPI_SCHEMA = "https"

    APOLLOAPI_APIKEY = aws_secretsmanager_secret.apollo_api_secret["AUTH_API_KEY"].name
    APOLLOAPI_HOST   = module.domains[local.env_prefix]["apollo-api"]
    APOLLOAPI_SCHEMA = "https"

    DD_API_KEY_SECRET_ARN = aws_secretsmanager_secret.common_secret["DD_API_KEY"].arn
    DD_TRACE_ENABLED      = "true"
    DD_SITE               = "datadoghq.com"
    DD_LAMBDA_HANDLER     = "apollo_playlists_messages.service.lambda_handler"
  }
}

data "aws_ecr_repository" "playlists_messages_ecr" {
  name = "${local.project_group}/lambda/playlists-messages"
}

resource "aws_cloudwatch_log_group" "playlists_messages_log_group" {
  for_each = toset([
    "playlists_entry",
    "playlists_tracklist_update",
    "playlists_exit",
    "playlists_major_move",
  ])

  name              = "/aws/lambda/${local.name_prefix}-${each.key}"
  retention_in_days = module.cloudwatch_logs_retention_by_env[local.env_prefix]

  tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "CloudWatch",
      plat_env_project_service = "${local.aggregated_tag}_PRL_CW"
    }
  )
}

resource "aws_secretsmanager_secret" "playlists_messages_secret" {
  for_each = toset(local.playlists_messages_secrets)

  name       = "${local.secrets_name_prefix}/playlists_messages/${each.value}"
  kms_key_id = data.aws_kms_key.secrets_general_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

module "playlists_messages_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix                = local.name_prefix
  name                       = "playlists_messages_role"
  allow_execution_inside_vpc = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_PRL_LMB"
    }
  )

  policies_list = [
    data.aws_iam_policy.logging_policy.arn,
    data.aws_iam_policy.secrets_services_ro.arn,
    data.aws_iam_policy.playlists_messages_entry_consumer_policy.arn,
    data.aws_iam_policy.playlists_messages_update_consumer_policy.arn,
    data.aws_iam_policy.playlists_messages_exit_consumer_policy.arn,
    data.aws_iam_policy.playlists_messages_major_move_consumer_policy.arn,
  ]
}

resource "aws_lambda_function" "playlists_messages_lambda" {
  for_each = toset([
    "playlists_entry",
    "playlists_tracklist_update",
  ])

  function_name                  = "${local.name_prefix}-${each.key}"
  image_uri                      = "${data.aws_ecr_repository.playlists_messages_ecr.repository_url}:${local.docker_image_env_tag[local.env_prefix]}"
  package_type                   = "Image"
  role                           = module.playlists_messages_role.role.arn
  description                    = "Managed by Terraform."
  reserved_concurrent_executions = 1

  timeout     = 300
  memory_size = 256

  vpc_config {
    security_group_ids = [data.aws_security_group.lambda.id]
    subnet_ids         = data.aws_subnets.private_subnets.ids
  }

  image_config {
    command = ["datadog_lambda.handler.handler"]
  }

  environment {
    variables = merge(
      local.playlists_messages_env_vars,
      {
        EVENT = each.key
      }
    )
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_PRL_LMB",
      service_name             = "apollo-${replace(each.key, "_", "-")}"
    }
  )

  depends_on = [
    aws_secretsmanager_secret.playlists_messages_secret,
    aws_cloudwatch_log_group.playlists_messages_log_group,
    module.playlists_messages_role,
  ]

  lifecycle {
    ignore_changes = [
      image_uri
    ]
  }
}

resource "aws_lambda_function" "playlists_messages_settings_v2_lambda" {
  for_each = toset([
    "playlists_exit",
    "playlists_major_move",
  ])

  function_name                  = "${local.name_prefix}-${each.key}"
  image_uri                      = "${data.aws_ecr_repository.playlists_messages_ecr.repository_url}:${local.docker_image_env_tag[local.env_prefix]}"
  package_type                   = "Image"
  role                           = module.playlists_messages_role.role.arn
  description                    = "Managed by Terraform."
  reserved_concurrent_executions = 1

  timeout     = 300
  memory_size = 256

  vpc_config {
    security_group_ids = [data.aws_security_group.lambda.id]
    subnet_ids         = data.aws_subnets.private_subnets.ids
  }

  image_config {
    command = ["datadog_lambda.handler.handler"]
  }

  environment {
    variables = merge(
      local.playlists_messages_env_vars,
      {
        EVENT            = each.key
        SETTINGS_VERSION = "2"
      }
    )
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_PRL_LMB",
      service_name             = "apollo-${replace(each.key, "_", "-")}"
    }
  )

  depends_on = [
    aws_secretsmanager_secret.playlists_messages_secret,
    aws_cloudwatch_log_group.playlists_messages_log_group,
    module.playlists_messages_role,
  ]

  lifecycle {
    ignore_changes = [
      image_uri
    ]
  }
}
/*
resource "aws_lambda_event_source_mapping" "playlists_messages_entry_lambda_sqs" {
  event_source_arn                   = data.aws_sqs_queue.playlists_messages_entry_queue.arn
  function_name                      = aws_lambda_function.playlists_messages_lambda["playlists_entry"].arn
  batch_size                         = 50
  maximum_batching_window_in_seconds = 60
}

resource "aws_lambda_event_source_mapping" "playlists_messages_update_lambda_sqs" {
  event_source_arn                   = data.aws_sqs_queue.playlists_messages_update_queue.arn
  function_name                      = aws_lambda_function.playlists_messages_lambda["playlists_tracklist_update"].arn
  batch_size                         = 5
  maximum_batching_window_in_seconds = 60
}

resource "aws_lambda_event_source_mapping" "playlists_messages_exit_lambda_sqs" {
  event_source_arn                   = data.aws_sqs_queue.playlists_messages_exit_queue.arn
  function_name                      = aws_lambda_function.playlists_messages_settings_v2_lambda["playlists_exit"].arn
  batch_size                         = 50
  maximum_batching_window_in_seconds = 60
}

resource "aws_lambda_event_source_mapping" "playlists_messages_major_move_lambda_sqs" {
  event_source_arn                   = data.aws_sqs_queue.playlists_messages_major_move_queue.arn
  function_name                      = aws_lambda_function.playlists_messages_settings_v2_lambda["playlists_major_move"].arn
  batch_size                         = 5
  maximum_batching_window_in_seconds = 60
}
*/
