locals {
  download_spotify_charts_secrets = [
    "SENTRY_DSN",
  ]
}

data "aws_ecr_repository" "download_spotify_charts_ecr" {
  name = "${local.project_group}/lambda/download-spotify-charts"

  provider = aws.gdb-apollo-dev
}

resource "aws_cloudwatch_log_group" "download_spotify_charts_log_group" {
  name              = "/aws/lambda/${local.name_prefix}-download_spotify_charts"
  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" "download_spotify_charts_secret" {
  for_each = toset(local.download_spotify_charts_secrets)

  name       = "${local.secrets_name_prefix}/download_spotify_charts/${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 "download_spotify_charts_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix                = local.name_prefix
  name                       = "download_spotify_charts_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.spotify_charts_s3_rw_policy.arn,
  ]
}

resource "aws_lambda_function" "download_spotify_charts_lambda" {
  function_name = "${local.name_prefix}-download_spotify_charts"
  image_uri     = "${data.aws_ecr_repository.download_spotify_charts_ecr.repository_url}:master"
  package_type  = "Image"
  role          = module.download_spotify_charts_role.role.arn
  description   = "Managed by Terraform."

  timeout     = 900
  memory_size = 256

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

  environment {
    variables = {
      ENVIRONMENT        = local.environment
      SENTRY_DSN         = "${local.secrets_name_prefix}/download_spotify_charts/SENTRY_DSN"
      AWS_S3_BUCKET_NAME = "${local.name_prefix}-spotify-charts"
      DSPAPI_APPKEY      = "${local.secrets_name_prefix}/dsp-api/DSPAPI_APPKEY"
      DSPAPI_HOSTNAME    = "${module.domains[local.env_prefix]["dsp-api"]}/api"
    }
  }

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

  depends_on = [
    aws_secretsmanager_secret.download_spotify_charts_secret,
    aws_cloudwatch_log_group.download_spotify_charts_log_group,
    module.download_spotify_charts_role,
  ]

  lifecycle {
    ignore_changes = [
      image_uri
    ]
  }
}


resource "aws_cloudwatch_event_rule" "download_spotify_charts_rule" {
  name                = "${local.name_prefix}-download_spotify_charts"
  description         = "Download Spotify Charts every hour."
  schedule_expression = "rate(1 hour)"
  is_enabled          = false

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

resource "aws_cloudwatch_event_target" "download_spotify_charts_target" {
  rule      = aws_cloudwatch_event_rule.download_spotify_charts_rule.name
  target_id = "${local.name_prefix}-download_spotify_charts"
  arn       = aws_lambda_function.download_spotify_charts_lambda.arn
}

resource "aws_lambda_permission" "allow_cloudwatch_to_call_download_spotify_charts_lambda" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.download_spotify_charts_lambda.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.download_spotify_charts_rule.arn
}

