locals {
  calculate_metrics_app_name = "${var.service_name}-calculate-metrics"
  calculate_metrics_app_dir  = "apps/lambda/calculate-metrics"
  calculate_metrics_app_hash = md5(join(",", [
    filemd5("${local.calculate_metrics_app_dir}/Dockerfile"),
    filemd5("${local.calculate_metrics_app_dir}/requirements.txt"),
    filemd5("${local.calculate_metrics_app_dir}/calculate-metrics.py"),
  ]))
}

resource "aws_ecr_repository" "calculate_metrics_app_repository" {
  name                 = local.calculate_metrics_app_name
  image_tag_mutability = "MUTABLE"

  encryption_configuration {
    encryption_type = "KMS"
  }

  image_scanning_configuration {
    scan_on_push = true
  }
}

resource "null_resource" "calculate_metrics_app_build" {
  triggers = {
    src_hash = local.calculate_metrics_app_hash
  }

  provisioner "local-exec" {
    command = "/bin/bash ./scripts/build-docker.sh"

    environment = {
      SRC_DIR             = local.calculate_metrics_app_dir
      ECR_REPOSITORY_NAME = aws_ecr_repository.calculate_metrics_app_repository.name
      ECR_REPOSITORY_TAG  = local.calculate_metrics_app_hash
      ECR_REPOSITORY_URL  = aws_ecr_repository.calculate_metrics_app_repository.repository_url
    }
  }
}

resource "aws_iam_policy" "calculate_metrics_app_policy" {
  name   = "${var.environment}-${local.calculate_metrics_app_name}-policy"
  policy = data.aws_iam_policy_document.calculate_metrics_app_policy.json
}

data "aws_iam_policy_document" "calculate_metrics_app_policy" {
  statement {
    effect    = "Allow"
    actions   = ["sqs:ListQueues", "sqs:GetQueueAttributes"]
    resources = ["*"]
  }

  statement {
    effect    = "Allow"
    actions   = ["ecs:ListTasks"]
    resources = ["*"]
  }

  statement {
    effect    = "Allow"
    actions   = ["cloudwatch:PutMetricData"]
    resources = ["*"]
    condition {
      test     = "StringEquals"
      variable = "cloudwatch:namespace"
      values   = ["${var.environment}-${var.service_name}"]
    }
  }
}

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

  environment        = var.environment
  lambda_name        = local.calculate_metrics_app_name
  application_family = var.application_family

  use_container_image        = true
  container_image_custom_uri = "${aws_ecr_repository.calculate_metrics_app_repository.repository_url}:latest"

  vpc_id         = var.vpc_id
  vpc_subnet_ids = var.vpc_subnet_ids

  datadog_enabled          = true
  datadog_advanced_enabled = false

  lambda_function_timeout                           = var.lambda_timeout
  lambda_function_reserved_concurrent_executions    = var.lambda_concurrency
  lambda_function_provisioned_concurrent_executions = 0

  lambda_function_environment_variables = {
    BUILD_ID             = null_resource.calculate_metrics_app_build.id
    ENVIRONMENT          = var.environment
    SERVICE_NAME         = var.service_name
    SQS_QUEUE_NAME_REGEX = var.sqs_queue_name_regex
    ECS_CLUSTER_NAME     = var.ecs_cluster_name
    ECS_SERVICE_NAME     = var.ecs_service_name
    LOG_LEVEL            = var.log_level
  }

  cloudwatch_event_enabled  = var.lambda_schedule_enabled
  cloudwatch_event_schedule = var.lambda_schedule_expression

  iam_managed_policy_attachments = [
    aws_iam_policy.calculate_metrics_app_policy.arn,
  ]
}
