resource "aws_cloudwatch_log_group" "spotifyconsumeranalytics_lambda_log_group" {
  for_each = local.licensors

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

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

resource "aws_cloudwatch_log_group" "appleconsumeranalytics_lambda_log_group" {
  name              = "/aws/lambda/${local.name_prefix}-appleconsumeranalytics"
  retention_in_days = module.cloudwatch_logs_retention_by_env[local.env_prefix]

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

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

  name_prefix = local.name_prefix
  name        = "consumeranalytics_lambda_role"

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

  policies_list = [
    data.aws_iam_policy.logging_policy.arn,
    data.aws_iam_policy.run_ecs_task_policy.arn,
  ]
}

resource "aws_lambda_function" "spotifyconsumeranalytics_lambda" {
  for_each = local.licensors

  function_name = "${local.name_prefix}-spotifyconsumeranalytics-${each.key}"
  s3_bucket     = data.aws_s3_bucket.artifacts_bucket.bucket
  s3_key        = "run_ecs_task.zip"
  role          = module.consumeranalytics_role.role.arn
  description   = "Managed by Terraform."
  handler       = "run_ecs_task.lambda_handler"

  runtime     = "python3.9"
  memory_size = 128
  timeout     = 30

  environment {
    variables = {
      ECS_CLUSTER     = data.aws_ecs_cluster.etl.cluster_name
      TASK_DEFINITION = "${local.name_prefix}-spotifyconsumeranalytics-${each.key}"
      TASK_REVISION   = module.spotifyconsumeranalytics_task_def[each.key].revision
      PUBLIC_IP       = "DISABLED"
      SUBNETS         = join(",", data.aws_subnets.private_subnets.ids)
      SECURITY_GROUPS = data.aws_security_group.lambda.id
    }
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "ETL",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_ETL_LMB"
      service_name             = "apollo-spotifyconsumeranalytics-${each.key}"
    }
  )

  depends_on = [
    aws_cloudwatch_log_group.spotifyconsumeranalytics_lambda_log_group,
    module.consumeranalytics_role,
  ]
}

resource "aws_lambda_permission" "spotifyconsumeranalytics_lambda_permission" {
  for_each = local.licensors

  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.spotifyconsumeranalytics_lambda[each.key].function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.spotifyconsumeranalytics_event_rule[each.key].arn
}

resource "aws_cloudwatch_event_rule" "spotifyconsumeranalytics_event_rule" {
  for_each = local.licensors

  name                = "${local.name_prefix}-spotifyconsumeranalytics-${each.key}"
  schedule_expression = "rate(15 minutes)"
}

resource "aws_cloudwatch_event_target" "spotifyconsumeranalytics_event_target" {
  for_each = local.licensors

  rule      = aws_cloudwatch_event_rule.spotifyconsumeranalytics_event_rule[each.key].name
  target_id = "lambda"
  arn       = aws_lambda_function.spotifyconsumeranalytics_lambda[each.key].arn
}

resource "aws_lambda_function" "appleconsumeranalytics_lambda" {
  function_name = "${local.name_prefix}-appleconsumeranalytics"
  s3_bucket     = data.aws_s3_bucket.artifacts_bucket.bucket
  s3_key        = "run_ecs_task.zip"
  role          = module.consumeranalytics_role.role.arn
  description   = "Managed by Terraform."
  handler       = "run_ecs_task.lambda_handler"

  runtime     = "python3.9"
  memory_size = 128
  timeout     = 30

  environment {
    variables = {
      ECS_CLUSTER     = data.aws_ecs_cluster.etl.cluster_name
      TASK_DEFINITION = "${local.name_prefix}-appleconsumeranalytics"
      TASK_REVISION   = module.appleconsumeranalytics_task_def.revision
      PUBLIC_IP       = "DISABLED"
      SUBNETS         = join(",", data.aws_subnets.private_subnets.ids)
      SECURITY_GROUPS = data.aws_security_group.lambda.id
    }
  }

  tags = merge(
    local.common_tags,
    {
      project                  = "ETL",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_ETL_LMB"
      service_name             = "apollo-appleconsumeranalytics"
    }
  )

  depends_on = [
    aws_cloudwatch_log_group.appleconsumeranalytics_lambda_log_group,
    module.consumeranalytics_role,
  ]
}

resource "aws_lambda_permission" "appleconsumeranalytics_lambda_permission" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.appleconsumeranalytics_lambda.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.appleconsumeranalytics_event_rule.arn
}

resource "aws_cloudwatch_event_rule" "appleconsumeranalytics_event_rule" {
  name                = "${local.name_prefix}-appleconsumeranalytics"
  schedule_expression = "rate(15 minutes)"
}

resource "aws_cloudwatch_event_target" "appleconsumeranalytics_event_target" {
  rule      = aws_cloudwatch_event_rule.appleconsumeranalytics_event_rule.name
  target_id = "lambda"
  arn       = aws_lambda_function.appleconsumeranalytics_lambda.arn
}
