resource "null_resource" "sns-topic-policy" {
  triggers = {
    aws_profile    = var.o11y_account_id
    aws_account_id = local.aws_account_id
    region         = element(split(":", var.sns_topic_arn), 3)
    sns_topic_arn  = var.sns_topic_arn
    cluster_name   = local.eks.name
  }

  provisioner "local-exec" {
    when        = create
    interpreter = ["uv", "run", "-w", "boto3", "python", "-c"]
    environment = {
      AWS_PROFILE    = self.triggers.aws_profile
      AWS_ACCOUNT_ID = self.triggers.aws_account_id
      SNS_TOPIC_ARN  = self.triggers.sns_topic_arn
      CLUSTER_NAME   = self.triggers.cluster_name
      REGION         = self.triggers.region
      PYTHONPATH     = path.module
    }
    command = <<-EOT
      import os
      from lib import insert_alarm_policy_into_sns

      insert_alarm_policy_into_sns(
        aws_profile=os.environ['AWS_PROFILE'],
        account_id=os.environ['AWS_ACCOUNT_ID'],
        sns_topic_arn=os.environ['SNS_TOPIC_ARN'],
        cluster_name=os.environ['CLUSTER_NAME'],
        region=os.environ['REGION']
      )
    EOT
  }

  provisioner "local-exec" {
    when        = destroy
    interpreter = ["uv", "run", "-w", "boto3", "python", "-c"]
    environment = {
      AWS_PROFILE    = self.triggers.aws_profile
      AWS_ACCOUNT_ID = self.triggers.aws_account_id
      SNS_TOPIC_ARN  = self.triggers.sns_topic_arn
      CLUSTER_NAME   = self.triggers.cluster_name
      REGION         = self.triggers.region
      PYTHONPATH     = path.module
    }
    command = <<-EOT
      import os
      from lib import remove_alarm_policy_from_sns

      remove_alarm_policy_from_sns(
        aws_profile=os.environ['AWS_PROFILE'],
        account_id=os.environ['AWS_ACCOUNT_ID'],
        sns_topic_arn=os.environ['SNS_TOPIC_ARN'],
        cluster_name=os.environ['CLUSTER_NAME'],
        region=os.environ['REGION']
      )
    EOT
  }
}


resource "aws_cloudwatch_metric_alarm" "watchdog_down" {
  alarm_name          = "WatchdogDown-${local.eks.name}"
  alarm_description   = "Alarm for ${local.eks.name}, triggered if deadmanswatch is down"
  namespace           = "DeadMansWatch"
  metric_name         = "Watchdog"
  comparison_operator = "LessThanThreshold"
  alarm_actions       = [var.sns_topic_arn]
  threshold           = 1
  evaluation_periods  = 5
  period              = 60
  statistic           = "Maximum"
  treat_missing_data  = "breaching"
  region              = null_resource.sns-topic-policy.triggers.region

  dimensions = {
    source      = local.eks.name
    environment = var.env
    scope       = "self-monitoring"
  }

  tags = merge({
    environment                   = var.env
    "tidbcloud-auto-deploy-owner" = local.eks.name
  }, var.tags)
}


resource "aws_cloudwatch_metric_alarm" "alertmanager_failed_to_send_alerts" {
  alarm_name          = "AlertmanagerClusterFailedToSendAlerts-${local.eks.name}"
  alarm_description   = "Alarm for ${local.eks.name}, triggered if alertmanager cluster failed to send alerts to jiralert"
  namespace           = "DeadMansWatch"
  metric_name         = "AlertmanagerClusterFailedToSendAlerts"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  alarm_actions       = [var.sns_topic_arn]
  threshold           = 1
  evaluation_periods  = 1
  period              = 120
  statistic           = "SampleCount"
  treat_missing_data  = "notBreaching"
  region              = null_resource.sns-topic-policy.triggers.region

  dimensions = {
    source      = local.eks.name
    environment = var.env
    scope       = "self-monitoring"
  }

  tags = merge({
    environment                   = var.env
    "tidbcloud-auto-deploy-owner" = local.eks.name
  }, var.tags)
}

