module "default_tags" {
  #checkov:skip=ORCD_AWS_2: no team name yet
  source             = "git@github.com:theorchard/terraform-default-tags.git//?ref=1.0.0"
  environment        = var.environment
  application_family = var.application_family
  service_name       = var.service_name
  #team_name          = var.team_name
}

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = module.default_tags.tags
  }
}

terraform {
  backend "s3" {
    bucket  = "prod-supply-chain-max-terraform-state"
    key     = "prod/lambda-ecs-scaler/terraform.tfstate"
    region  = "eu-central-1"
    encrypt = "true"
  }
}

data "aws_caller_identity" "current" {}

data "aws_ecs_cluster" "cluster" {
  cluster_name = var.ecs_map.cluster_name
}

data "aws_ecs_service" "services" {
  for_each     = toset(var.ecs_map.services)
  cluster_arn  = data.aws_ecs_cluster.cluster.arn
  service_name = each.value
}

data "aws_iam_policy_document" "lambda_assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["lambda.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "lambda_role" {
  name               = "lambda-${var.environment}-${var.service_name}"
  assume_role_policy = data.aws_iam_policy_document.lambda_assume_role.json
}

data "aws_iam_policy_document" "scaler_lambda_policy" {
  statement {
    sid = "AllowECSServiceUpdate"
    actions = [
      "ecs:UpdateService",
      "ecs:DescribeServices"
    ]
    resources = [
      for service in data.aws_ecs_service.services : service.arn
    ]
  }
  statement {
    sid = "AllowECSDescribeCluster"
    actions = [
      "ecs:DescribeClusters",
    ]
    resources = [data.aws_ecs_cluster.cluster.arn]
  }
  statement {
    sid = "AllowCloudWatchLogs"
    actions = [
      "logs:PutLogEvents",
      "logs:CreateLogStream",
      "logs:CreateLogGroup"
    ]
    resources = ["arn:aws:logs:${var.aws_region}:${data.aws_caller_identity.current.account_id}:log-group:/aws/lambda/*"]
  }
}

resource "aws_iam_role_policy" "scaler_lambda_policy" {
  name   = "${var.environment}-${var.service_name}-policy"
  role   = aws_iam_role.lambda_role.id
  policy = data.aws_iam_policy_document.scaler_lambda_policy.json
}
