locals {
  version      = trimspace(file("${path.module}/../../VERSION"))
  archive_path = path.root
  archive_name = "${var.name}-${local.version}.zip"
}

data "archive_file" "this" {
  type        = "zip"
  source_dir  = "${path.module}/../../"
  output_path = "${local.archive_path}/${local.archive_name}"
  excludes = [
    "infra",
    "venv",
    "README.md",
    "VERSION",
    "*.zip",
  ]
}

resource "google_storage_bucket_object" "archive" {
  name   = "${var.name}-${local.version}-${filemd5("${local.archive_path}/${local.archive_name}")}.zip"
  bucket = var.lambda_bucket
  source = "${local.archive_path}/${local.archive_name}"
}

resource "google_cloudfunctions_function" "function" {
  name        = var.name
  description = "Triggers Bigtable scaling"
  runtime     = "python311"

  available_memory_mb   = 256
  source_archive_bucket = var.lambda_bucket
  source_archive_object = google_storage_bucket_object.archive.name

  event_trigger {
    event_type = "google.pubsub.topic.publish"
    resource   = google_pubsub_topic.topic.id
  }

  entry_point   = "main"
  timeout       = 300
  max_instances = 1

  environment_variables = {
    GCP_PROJECT      = var.project_id
    INSTANCE_ID      = var.instance_id
    CLUSTER_ID       = var.cluster_id
    CLUSTER_BASELINE = tostring(var.cluster_baseline)
    CLUSTER_MAX_SIZE = tostring(var.cluster_max_size)
    SLACK_CHANNEL_ID = var.slack_channel_id
  }

  secret_environment_variables {
    key     = "SLACK_TOKEN"
    secret  = var.slack_secret
    version = "latest"
  }
}

resource "google_pubsub_topic" "topic" {
  name = var.topic
}

resource "google_cloud_scheduler_job" "scale" {
  count       = var.scheduler_enabled ? 1 : 0
  name        = "delphi-bigtable-scale-job"
  description = "Schedule Bigtable scale"
  schedule    = var.scale_schedule

  pubsub_target {
    topic_name = google_pubsub_topic.topic.id
    data = base64encode(
      jsonencode(
        {
          "scale" = var.scale_factor
        }
      )
    )
  }

  depends_on = [
    google_cloudfunctions_function.function,
    google_pubsub_topic.topic,
  ]
}

resource "google_cloud_scheduler_job" "baseline" {
  count       = var.scheduler_enabled ? 1 : 0
  name        = "delphi-bigtable-baseline-job"
  description = "Schedule Bigtable revert scaling to baseline"
  schedule    = var.baseline_schedule

  pubsub_target {
    topic_name = google_pubsub_topic.topic.id
    data = base64encode(
      jsonencode(
        {
          "to_baseline" = ""
        }
      )
    )
  }

  depends_on = [
    google_cloudfunctions_function.function,
    google_pubsub_topic.topic,
  ]
}
