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 retention jobs based on status table"
  runtime     = "python311"

  available_memory_mb   = 512
  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 = {
    PROJECT_ID              = tostring(var.project_id)
    REGION_ID               = tostring(var.region_id)
    BT_INSTANCE_ID          = tostring(var.instance_id)
    START_YEAR              = tostring(var.start_year)
    RETENTION_MONTHS        = tostring(var.retention_months)
    KEY_PREFIX              = tostring(var.key_prefix)
    DF_STAGING_LOCATION     = tostring(var.df_staging_location)
    DF_TEMPLATE             = tostring(var.df_template)
    DF_MAX_NUM_WORKERS      = tostring(var.df_max_num_workers)
    SIMULTANEOUS_JOBS_LIMIT = tostring(var.simultaneous_jobs_limit)
    JOB_TIMEOUT_HOURS       = tostring(var.job_timeout_hours)
    JOB_MAX_RETRIES         = tostring(var.job_max_retries)
    SLACK_CHANNEL_ID        = tostring(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" "schedule" {
  count       = var.scheduler_enabled ? 1 : 0
  name        = "delphi-bf-data-retention-manager-job"
  description = "Schedule Bigtable retention jobs"
  schedule    = var.schedule

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

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



