data "aws_iam_policy_document" "ecs_assume_role" {
  statement {
    sid     = "AllowAssumeRoleFromECSTasks"
    effect  = "Allow"
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ecs-tasks.amazonaws.com"]
    }
  }
}

data "aws_iam_policy_document" "gcp_provider_task_role" {

  statement {
    sid = "AwsProviderSecretsSecretsAccess"
    effect = "Allow"
    actions = [
      "ses:*",
      "logs:PutLogEvents",
      "logs:CreateLogStream",
    ]
    resources = ["*"]
  }
  statement {
    sid = "GcpProviderSecretsSecretsAccess"
    effect = "Allow"
    actions = [
      "secretsmanager:GetSecretValue",
    ]
    resources = ["arn:aws:secretsmanager:*:*:/secret/gcp-provider-service*", "*"]
  }
  statement {
    sid = "GcpProviderDynamoDBAccess"
    effect = "Allow"
    actions = [
      "dynamodb:BatchGet*",
      "dynamodb:Describe*",
      "dynamodb:Get*",
      "dynamodb:List*",
      "dynamodb:Query",
      "dynamodb:Scan"
    ]
    resources = local.workspace["dynamodb_access"]
  }

  statement {
    sid = "GcpProviderDynamoDBLockAccess"
    effect = "Allow"
    actions = [
      "dynamodb:DeleteItem",
      "dynamodb:GetItem",
      "dynamodb:PutItem",
      "dynamodb:Scan",
      "dynamodb:UpdateItem"
    ]
    resources = local.workspace["dynamodb_lock_access"]
  }

  statement {
    sid = "GcpProviderDynamoDBIPManagement"
    effect = "Allow"
    actions = [
      "dynamodb:DeleteItem",
      "dynamodb:GetItem",
      "dynamodb:PutItem",
      "dynamodb:Scan",
      "dynamodb:UpdateItem"
    ]
    resources = local.workspace["dynamodb_ip_management"]
  }

  statement {
    sid = "GcpProviderECSTaskExecution"
    effect = "Allow"
    actions = [
      "ecr:GetAuthorizationToken",
      "ecr:BatchCheckLayerAvailability",
      "ecr:GetDownloadUrlForLayer",
      "ecr:BatchGetImage",
      "logs:CreateLogStream",
      "logs:PutLogEvents"
    ]
    resources = ["*"]
  }
}


resource "aws_iam_policy" "gcp_provider_task_role" {
  name = "${local.workspace["service_name"]}${local.workspace["iam_suffix"]}"
  policy = data.aws_iam_policy_document.gcp_provider_task_role.json
}

resource "aws_iam_role" "gcp_provider_task_role" {
  name = "${local.workspace["service_name"]}-task-role${local.workspace["iam_suffix"]}"
  assume_role_policy = data.aws_iam_policy_document.ecs_assume_role.json
}

resource "aws_iam_role_policy_attachment" "gcp_provider_task_role_policy_attach" {
  role = aws_iam_role.gcp_provider_task_role.name
  policy_arn = aws_iam_policy.gcp_provider_task_role.arn
}

#
##
### if Sandbox then create a user with the same policies for localhost MOP
##
#

# create an IAM user for the localhost service
resource "aws_iam_user" "gcp_provider_service" {
  name = "gcp_provider_service"
  count = local.workspace["deploy_environment"] == "sandbox" ? 1 : 0
}
# this credential lives in mop-utils/sandbox-credentials
resource "aws_iam_access_key" "gcp_provider_service" {
  user = aws_iam_user.gcp_provider_service[0].name
  count = local.workspace["deploy_environment"] == "sandbox" ? 1 : 0
}

# attach the same policies held by the task role
resource "aws_iam_user_policy_attachment" "gcp_provider_task_role_policy_attach" {
  user       = aws_iam_user.gcp_provider_service[0].name
  policy_arn = aws_iam_policy.gcp_provider_task_role.arn
  count = local.workspace["deploy_environment"] == "sandbox" ? 1 : 0
}

