locals {
  sentry_secrets_list = [
    "GITHUB_API_SECRET",
    "SENTRY_DB_PASSWORD",
  ]

  sentry_common_secrets = {}

  sentry_secrets_mapping = [
    for k, v in merge(aws_secretsmanager_secret.sentry_secret, local.sentry_common_secrets) :
    {
      name      = k,
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
    }
  ]

  sentry_env_vars_map = {
    "GITHUB_APP_ID" = "ef7b88a08202eca30dd5"
    "SENTRY_POSTGRES_HOST" = aws_db_instance.sentry_db.address
    "SENTRY_POSTGRES_PORT" = aws_db_instance.sentry_db.port
    "SENTRY_DB_NAME" = "sentry_db"
    "SENTRY_DB_USER" = aws_db_instance.sentry_db.username
    # "SENTRY_REDIS_HOST" = aws_elasticache_cluster.sentry_cache.cache_nodes[0].address
    "SNUBA" = "http://${module.sentry_ec2.ec2[0].private_ip}:1218"
    # "SENTRY_MEMCACHED_HOST" = aws_elasticache_cluster.sentry_memcached.cache_nodes[0].address
    # "SENTRY_KAFKA_BROKERS" = "${module.sentry_ec2.ec2[0].private_ip}:9092"
    # "SENTRY_KAFKA_BROKERS" = aws_msk_cluster.msk.bootstrap_brokers_tls
    "SENTRY_KAFKA_SECURITY" = "ssl"
  }
  sentry_env_vars = [for k, v in local.sentry_env_vars_map : { "name" = k, "value" = v }]
}

data "aws_ecs_cluster" "main" {
  cluster_name = "${local.name_prefix}-clu"
}

resource "aws_secretsmanager_secret" "sentry_secret" {
  for_each = toset(local.sentry_secrets_list)

  name       = "${local.secrets_name_prefix}/sentry/${each.value}"
  kms_key_id = data.aws_kms_key.serviceonly_key.id

  tags = merge(
    local.sentry_tags,
    {
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

/*
module "sentry_web_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-sentry-web"
  container_name  = "sentry-web"
  container_image = "${module.sentry_ecr.ecr.repository_url}:10.0.0-v2"
  cpu             = 512
  memory          = 1024

  awslogs_retention = 90

  task_role_arn = data.aws_iam_role.ecs_task_runner_role.arn
  exec_role_arn = data.aws_iam_role.ecs_task_runner_role.arn

  env_vars = local.sentry_env_vars
  secrets  = local.sentry_secrets_mapping

  port_mappings = [
    {
      containerPort = 9000
      hostPort      = 9000
      protocol      = "tcp"
    }
  ]

  efs_volume_enabled = true
  efs_volume_name    = "sentry-data"
  efs_file_system_id = aws_efs_file_system.sentry.id
  efs_root_directory = "/"

  mount_points = [
    {
      containerPath = "/data",
      readOnly      = false,
      sourceVolume  = "sentry-data"
    }
  ]

  common_tags = merge(
    local.sentry_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_worker_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-sentry-worker"
  container_name  = "sentry-worker"
  container_image = "${module.sentry_ecr.ecr.repository_url}:10.0.0-v2"
  cpu             = 4096
  memory          = 8192
  command         = ["run", "worker"]

  awslogs_retention = 90

  task_role_arn = data.aws_iam_role.ecs_task_runner_role.arn
  exec_role_arn = data.aws_iam_role.ecs_task_runner_role.arn

  env_vars = local.sentry_env_vars
  secrets  = local.sentry_secrets_mapping

  efs_volume_enabled = true
  efs_volume_name    = "sentry-data"
  efs_file_system_id = aws_efs_file_system.sentry.id
  efs_root_directory = "/"

  mount_points = [
    {
      containerPath = "/data",
      readOnly      = false,
      sourceVolume  = "sentry-data"
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_cron_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-sentry-cron"
  container_name  = "sentry-cron"
  container_image = "${module.sentry_ecr.ecr.repository_url}:10.0.0-v2"
  cpu             = 256
  memory          = 512
  command         = ["run", "cron"]

  awslogs_retention = 90

  task_role_arn = data.aws_iam_role.ecs_task_runner_role.arn
  exec_role_arn = data.aws_iam_role.ecs_task_runner_role.arn

  env_vars = local.sentry_env_vars
  secrets  = local.sentry_secrets_mapping

  efs_volume_enabled = true
  efs_volume_name    = "sentry-data"
  efs_file_system_id = aws_efs_file_system.sentry.id
  efs_root_directory = "/"

  mount_points = [
    {
      containerPath = "/data",
      readOnly      = false,
      sourceVolume  = "sentry-data"
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_scheduled_cleanup_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-sentry-cleanup"
  container_name  = "sentry-cleanup"
  container_image = "${module.sentry_ecr.ecr.repository_url}:10.0.0-v2"
  cpu             = 512
  memory          = 1024
  command         = ["gosu", "sentry", "sentry", "cleanup", "--days", "30"]

  awslogs_retention = 90

  task_role_arn = data.aws_iam_role.ecs_task_runner_role.arn
  exec_role_arn = data.aws_iam_role.ecs_task_runner_role.arn

  env_vars = local.sentry_env_vars
  secrets  = local.sentry_secrets_mapping

  efs_volume_enabled = true
  efs_volume_name    = "sentry-data"
  efs_file_system_id = aws_efs_file_system.sentry.id
  efs_root_directory = "/"

  mount_points = [
    {
      containerPath = "/data",
      readOnly      = false,
      sourceVolume  = "sentry-data"
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}


module "sentry_post_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-sentry-post"
  container_name  = "sentry-post"
  container_image = "${module.sentry_ecr.ecr.repository_url}:10.0.0-v2"
  cpu             = 256
  memory          = 512
  command         = ["run", "post-process-forwarder", "--commit-batch-size", "1"]

  awslogs_retention = 90

  task_role_arn = data.aws_iam_role.ecs_task_runner_role.arn
  exec_role_arn = data.aws_iam_role.ecs_task_runner_role.arn

  env_vars = [for k, v in merge(
    local.sentry_env_vars_map,
    {"SENTRY_KAFKA_BROKERS" = aws_msk_cluster.msk.bootstrap_brokers,
    "SENTRY_KAFKA_SECURITY" = "plaintext"
    }) : { "name" = k, "value" = v }]
  secrets  = local.sentry_secrets_mapping

  efs_volume_enabled = true
  efs_volume_name    = "sentry-data"
  efs_file_system_id = aws_efs_file_system.sentry.id
  efs_root_directory = "/"

  mount_points = [
    {
      containerPath = "/data",
      readOnly      = false,
      sourceVolume  = "sentry-data"
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_web_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "sentry-web"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 2

  security_groups = [aws_security_group.sg_sentry.id, data.aws_security_group.efs.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  task_definition_arn = module.sentry_web_task_def.arn

  alb_enabled              = true
  https_listener_arn       = data.aws_alb_listener.main_alb_https.arn
  tg_health_check_path     = "/_health/"
  tg_health_check_matcher  = "200"
  tg_health_check_interval = 120
  tg_health_check_timeout  = 60
  tg_unhealthy_threshold   = 10
  container_port           = 9000
  url                      = module.domains.dev["sentry"]

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.sentry_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_worker_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "sentry-worker"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1
  min_percent   = 0
  max_percent   = 100

  security_groups = [aws_security_group.sg_sentry.id, data.aws_security_group.efs.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  task_definition_arn = module.sentry_worker_task_def.arn

  alb_enabled = false

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.sentry_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_cron_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "sentry-cron"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1
  min_percent   = 0
  max_percent   = 100

  security_groups = [aws_security_group.sg_sentry.id, data.aws_security_group.efs.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  task_definition_arn = module.sentry_cron_task_def.arn

  alb_enabled = false

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.sentry_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

module "sentry_post_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "sentry-post"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1
  min_percent   = 0
  max_percent   = 100

  security_groups = [aws_security_group.sg_sentry.id, data.aws_security_group.efs.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  task_definition_arn = module.sentry_post_task_def.arn

  alb_enabled = false

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.sentry_tags,
    {
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_ECS"
    }
  )
}

resource "aws_cloudwatch_event_rule" "sentry_clean_up" {
  name                = "${local.name_prefix}-sentry_clean_up"
  description         = "Run ${local.name_prefix}-sentry_clean_up task at a scheduled time (cron(0 0 ? * * *))"
  schedule_expression = "cron(0 0 ? * * *)"
  is_enabled          = true
}

resource "aws_cloudwatch_event_target" "this" {
  target_id = "${local.name_prefix}-scheduled_task_target"
  rule      = aws_cloudwatch_event_rule.sentry_clean_up.name
  arn       = data.aws_ecs_cluster.main.arn
  role_arn  = data.aws_iam_role.ecs_scheduler_role.arn

  ecs_target {
    task_count          = 1
    task_definition_arn = module.sentry_scheduled_cleanup_task_def.arn
    launch_type         = "FARGATE"
    network_configuration {
      subnets         = data.aws_subnets.private_subnets.ids
      security_groups = [aws_security_group.sg_sentry.id, data.aws_security_group.efs.id]
    }
  }
}

module "sentry_web_appautoscaling" {
  source = "../../../modules/appautoscaling/ecs"

  env_prefix    = local.env_prefix
  max_capacity  = 20
  min_capacity  = 2
  project       = "sentry-web"
  project_group = local.project_group
  resource_id   = "service/${data.aws_ecs_cluster.main.cluster_name}/${module.sentry_web_service.ecs_service.name}"
}

resource "aws_cloudwatch_metric_alarm" "sentry_web_high_usage_alarm" {
  alarm_name          = "${local.name_prefix}-sentry-web_high_cpu_usage"
  alarm_description   = "Average CPU usage is greater than threshold."
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 1
  metric_name         = "CPUUtilization"
  namespace           = "AWS/ECS"
  statistic           = "Average"
  period              = 180
  threshold           = 80
  actions_enabled     = true
  alarm_actions       = [module.sentry_web_appautoscaling.scaling_up_policy.arn]

  dimensions = {
    ClusterName = data.aws_ecs_cluster.main.cluster_name
    ServiceName = module.sentry_web_service.ecs_service.name
  }

  tags = merge(
    local.sentry_tags,
    {
      service                  = "Cloud Watch",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_CW"
    }
  )
}

resource "aws_cloudwatch_metric_alarm" "sentry_web_low_usage_alarm" {
  alarm_name          = "${local.name_prefix}-sentry-web_low_cpu_usage"
  alarm_description   = "Average CPU utilization is less than threshold."
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = 2
  metric_name         = "CPUUtilization"
  namespace           = "AWS/ECS"
  statistic           = "Average"
  period              = 240
  threshold           = 50
  actions_enabled     = true
  alarm_actions       = [module.sentry_web_appautoscaling.scaling_down_policy.arn]

  dimensions = {
    ClusterName = data.aws_ecs_cluster.main.cluster_name
    ServiceName = module.sentry_web_service.ecs_service.name
  }

  tags = merge(
    local.sentry_tags,
    {
      service                  = "Cloud Watch",
      plat_env_project_service = "${local.aggregated_tag}_SNTR_CW"
    }
  )
}
*/
